Initial Version

This commit is contained in:
2025-05-23 20:44:23 +02:00
parent d6ce2cbcec
commit 00f18baa2d
27 changed files with 21261 additions and 0 deletions

95
backend/schemas.py Normal file
View File

@@ -0,0 +1,95 @@
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime
# Base schemas
class GroceryBase(BaseModel):
name: str
price: float = Field(..., gt=0)
category: str
organic: bool = False
weight: Optional[float] = None
weight_unit: str = "g"
class GroceryCreate(GroceryBase):
pass
class GroceryUpdate(BaseModel):
name: Optional[str] = None
price: Optional[float] = Field(None, gt=0)
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
class Config:
from_attributes = True
# Shopping Event schemas
class GroceryInEvent(BaseModel):
grocery_id: int
amount: float = Field(..., gt=0)
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
shop: Shop
groceries: List[Grocery] = []
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