109 lines
2.6 KiB
Python
109 lines
2.6 KiB
Python
from pydantic import BaseModel, Field
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
|
|
# Base schemas
|
|
class GroceryBase(BaseModel):
|
|
name: str
|
|
category: str
|
|
organic: bool = False
|
|
weight: Optional[float] = None
|
|
weight_unit: str = "g"
|
|
|
|
class GroceryCreate(GroceryBase):
|
|
pass
|
|
|
|
class GroceryUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
category: Optional[str] = None
|
|
organic: Optional[bool] = None
|
|
weight: Optional[float] = None
|
|
weight_unit: Optional[str] = None
|
|
|
|
class Grocery(GroceryBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: Optional[datetime] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
# Shop schemas
|
|
class ShopBase(BaseModel):
|
|
name: str
|
|
city: str
|
|
address: Optional[str] = None
|
|
|
|
class ShopCreate(ShopBase):
|
|
pass
|
|
|
|
class ShopUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
city: Optional[str] = None
|
|
address: Optional[str] = None
|
|
|
|
class Shop(ShopBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: Optional[datetime] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
# Shopping Event schemas
|
|
class GroceryInEvent(BaseModel):
|
|
grocery_id: int
|
|
amount: float = Field(..., gt=0)
|
|
price: float = Field(..., ge=0) # Price at the time of this shopping event (allow free items)
|
|
|
|
class GroceryWithEventData(BaseModel):
|
|
id: int
|
|
name: str
|
|
category: str
|
|
organic: bool
|
|
weight: Optional[float] = None
|
|
weight_unit: str
|
|
amount: float # Amount purchased in this event
|
|
price: float # Price at the time of this event
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
class ShoppingEventBase(BaseModel):
|
|
shop_id: int
|
|
date: Optional[datetime] = None
|
|
total_amount: Optional[float] = Field(None, ge=0)
|
|
notes: Optional[str] = None
|
|
|
|
class ShoppingEventCreate(ShoppingEventBase):
|
|
groceries: List[GroceryInEvent] = []
|
|
|
|
class ShoppingEventUpdate(BaseModel):
|
|
shop_id: Optional[int] = None
|
|
date: Optional[datetime] = None
|
|
total_amount: Optional[float] = Field(None, ge=0)
|
|
notes: Optional[str] = None
|
|
groceries: Optional[List[GroceryInEvent]] = None
|
|
|
|
class ShoppingEventResponse(ShoppingEventBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: Optional[datetime] = None
|
|
shop: Shop
|
|
groceries: List[GroceryWithEventData] = []
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
# Statistics schemas
|
|
class CategoryStats(BaseModel):
|
|
category: str
|
|
total_spent: float
|
|
item_count: int
|
|
avg_price: float
|
|
|
|
class ShopStats(BaseModel):
|
|
shop_name: str
|
|
total_spent: float
|
|
visit_count: int
|
|
avg_per_visit: float |