from typing import Optional from pydantic import BaseModel, validator class Pen(BaseModel): name: str color: str brand: str price: int stock: int @validator('name') def name_must_not_be_empty(cls, value): if not value.strip(): raise ValueError('Name cannot be empty') return value @validator('color') def color_must_not_be_empty(cls, value): if not value.strip(): raise ValueError('Color cannot be empty') return value @validator('brand') def brand_must_not_be_empty(cls, value): if not value.strip(): raise ValueError('Brand cannot be empty') return value @validator('price') def price_must_be_positive(cls, value): if value <= 0: raise ValueError('Price must be a positive integer') return value @validator('stock') def stock_must_be_non_negative(cls, value): if value < 0: raise ValueError('Stock cannot be negative') return value def create_pen(db, pen_data: Pen): pen = Pen(**pen_data.dict()) db.add(pen) db.commit() db.refresh(pen) return pen def get_pen(db, pen_id: int) -> Optional[Pen]: return db.query(Pen).filter(Pen.id == pen_id).first() def update_pen(db, pen_id: int, pen_data: Pen): pen = get_pen(db, pen_id) if not pen: return None for field, value in pen_data.dict(exclude_unset=True).items(): setattr(pen, field, value) db.commit() db.refresh(pen) return pen def delete_pen(db, pen_id: int): pen = get_pen(db, pen_id) if not pen: return None db.delete(pen) db.commit() return pen