67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
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 |