from typing import Optional from pydantic import BaseModel, validator from sqlalchemy.orm import Session from models import Pen class PenCreate(BaseModel): name: str color: str brand: str price: int @validator('name', 'color', 'brand') def validate_string_not_empty(cls, value): if not value or not value.strip(): raise ValueError('Field cannot be empty or contain only whitespace characters') return value @validator('price') def validate_price(cls, value): if value < 0: raise ValueError('Price cannot be negative') return value def create_pen(db: Session, pen_data: PenCreate) -> Pen: """ Create a new pen in the database. Args: db: Database session pen_data: Pen data for creation Returns: Pen object """ pen = Pen(**pen_data.dict()) db.add(pen) db.commit() db.refresh(pen) return pen def get_pen_by_name(db: Session, name: str) -> Optional[Pen]: """ Get a pen by its name. Args: db: Database session name: Name of the pen Returns: Pen object if found, None otherwise """ return db.query(Pen).filter(Pen.name == name).first() def update_pen(db: Session, pen_id: int, pen_data: PenCreate) -> Optional[Pen]: """ Update an existing pen in the database. Args: db: Database session pen_id: ID of the pen to update pen_data: Updated pen data Returns: Updated Pen object if successful, None otherwise """ pen = db.query(Pen).filter(Pen.id == pen_id).first() if pen: for key, value in pen_data.dict(exclude_unset=True).items(): setattr(pen, key, value) db.commit() db.refresh(pen) return pen return None def delete_pen(db: Session, pen_id: int) -> bool: """ Delete a pen from the database. Args: db: Database session pen_id: ID of the pen to delete Returns: True if successful, False otherwise """ pen = db.query(Pen).filter(Pen.id == pen_id).first() if pen: db.delete(pen) db.commit() return True return False