50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
import json
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field, validator
|
|
|
|
|
|
class CartItemBase(BaseModel):
|
|
product_id: str
|
|
quantity: int = Field(..., gt=0)
|
|
custom_properties: dict[str, Any] | None = None
|
|
|
|
class CartItemCreate(CartItemBase):
|
|
pass
|
|
|
|
class CartItemUpdate(BaseModel):
|
|
quantity: int | None = Field(None, gt=0)
|
|
custom_properties: dict[str, Any] | None = None
|
|
|
|
class CartItemInDBBase(CartItemBase):
|
|
id: str
|
|
user_id: str
|
|
price_at_addition: float
|
|
created_at: datetime
|
|
updated_at: datetime | None = None
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
|
|
@validator('custom_properties', pre=True)
|
|
def parse_custom_properties(cls, v):
|
|
if isinstance(v, str):
|
|
try:
|
|
return json.loads(v)
|
|
except:
|
|
return None
|
|
return v
|
|
|
|
class CartItem(CartItemInDBBase):
|
|
product_name: str
|
|
product_image: str | None = None
|
|
current_price: float
|
|
subtotal: float
|
|
|
|
class CartSummary(BaseModel):
|
|
items: list[CartItem]
|
|
total_items: int
|
|
subtotal: float
|
|
total_weight: float | None = None
|