2026-06-03 00:17:12 +12:00
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductRow(BaseModel):
|
|
|
|
|
id: int
|
|
|
|
|
tenant_id: str
|
|
|
|
|
client_name: str
|
|
|
|
|
item_id: str | None
|
|
|
|
|
name: str
|
|
|
|
|
mix_id: int
|
|
|
|
|
mix_client_name: str
|
|
|
|
|
mix_name: str
|
|
|
|
|
sale_type: str
|
|
|
|
|
unit_of_measure: str
|
|
|
|
|
visible: bool
|
|
|
|
|
product_notes: str | None
|
|
|
|
|
mix_notes: str | None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductUpdate(BaseModel):
|
|
|
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
|
|
|
|
|
|
client_name: str | None = Field(default=None, min_length=1, max_length=255)
|
|
|
|
|
name: str | None = Field(default=None, min_length=1, max_length=255)
|
|
|
|
|
item_id: str | None = Field(default=None, max_length=128)
|
|
|
|
|
mix_id: int | None = None
|
|
|
|
|
sale_type: str | None = Field(default=None, min_length=1, max_length=64)
|
|
|
|
|
unit_of_measure: str | None = Field(default=None, min_length=1, max_length=64)
|
|
|
|
|
visible: bool | None = None
|
|
|
|
|
notes: str | None = Field(default=None, max_length=2000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorMixUpdate(BaseModel):
|
|
|
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
|
|
|
|
|
|
client_name: str | None = Field(default=None, min_length=1, max_length=255)
|
|
|
|
|
name: str | None = Field(default=None, min_length=1, max_length=255)
|
|
|
|
|
notes: str | None = Field(default=None, max_length=2000)
|
2026-06-03 15:09:21 +12:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductIngredientCreate(BaseModel):
|
|
|
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
|
|
|
|
|
|
raw_material_id: int
|
|
|
|
|
quantity_kg: float = Field(gt=0)
|
|
|
|
|
notes: str | None = Field(default=None, max_length=1000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductIngredientUpdate(BaseModel):
|
|
|
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
|
|
|
|
|
|
quantity_kg: float | None = Field(default=None, gt=0)
|
|
|
|
|
notes: str | None = Field(default=None, max_length=1000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductIngredientRead(BaseModel):
|
|
|
|
|
id: int
|
|
|
|
|
raw_material_id: int
|
|
|
|
|
raw_material_name: str
|
|
|
|
|
quantity_kg: float
|
|
|
|
|
sort_order: int
|
|
|
|
|
notes: str | None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditorProductFormulaRead(BaseModel):
|
|
|
|
|
id: int
|
|
|
|
|
tenant_id: str
|
|
|
|
|
client_name: str
|
|
|
|
|
name: str
|
|
|
|
|
mix_id: int
|
|
|
|
|
mix_name: str
|
|
|
|
|
ingredients: list[EditorProductIngredientRead]
|
|
|
|
|
total_kg: float
|