This commit is contained in:
2026-05-10 09:46:07 +12:00
parent cfc193b713
commit 2f2466ecac
81 changed files with 2571 additions and 413 deletions
+9 -5
View File
@@ -1,30 +1,34 @@
from datetime import datetime
from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict, Field
class ClientUserCreate(BaseModel):
model_config = ConfigDict(extra="forbid")
client_account_id: int
full_name: str
email: str
full_name: str = Field(min_length=1, max_length=255)
email: str = Field(min_length=3, max_length=255)
role: str = "viewer"
status: str = "invited"
is_new_user: bool = True
class ClientUserUpdate(BaseModel):
full_name: str | None = None
email: str | None = None
model_config = ConfigDict(extra="forbid")
full_name: str | None = Field(default=None, min_length=1, max_length=255)
email: str | None = Field(default=None, min_length=3, max_length=255)
role: str | None = None
status: str | None = None
is_new_user: bool | None = None
class ClientFeatureUpdate(BaseModel):
model_config = ConfigDict(extra="forbid")
enabled: bool
class ClientUserModulePermissionUpdate(BaseModel):
model_config = ConfigDict(extra="forbid")
access_level: str
+12 -9
View File
@@ -4,14 +4,16 @@ from pydantic import BaseModel, ConfigDict, Field
class MixIngredientCreate(BaseModel):
model_config = ConfigDict(extra="forbid")
raw_material_id: int
quantity_kg: float = Field(gt=0)
notes: str | None = None
notes: str | None = Field(default=None, max_length=1000)
class MixIngredientUpdate(BaseModel):
model_config = ConfigDict(extra="forbid")
quantity_kg: float | None = Field(default=None, gt=0)
notes: str | None = None
notes: str | None = Field(default=None, max_length=1000)
class MixIngredientRead(BaseModel):
@@ -26,20 +28,22 @@ class MixIngredientRead(BaseModel):
class MixCreate(BaseModel):
client_name: str
name: str
model_config = ConfigDict(extra="forbid")
client_name: str = Field(min_length=1, max_length=255)
name: str = Field(min_length=1, max_length=255)
status: str = "draft"
version: int = 1
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
ingredients: list[MixIngredientCreate]
class MixUpdate(BaseModel):
client_name: str | None = None
name: str | None = None
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)
status: str | None = None
version: int | None = None
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class MixRead(BaseModel):
@@ -57,4 +61,3 @@ class MixRead(BaseModel):
mix_cost_per_kg: float | None
warnings: list[str]
model_config = ConfigDict(from_attributes=True)
+6 -4
View File
@@ -30,13 +30,14 @@ class MixCalculatorSessionLineRead(BaseModel):
class MixCalculatorSessionBase(BaseModel):
model_config = ConfigDict(extra="forbid")
mix_date: date
client_name: str
client_name: str = Field(min_length=1, max_length=255)
product_id: int
batch_size_kg: float = Field(gt=0)
prepared_by_name: str = Field(min_length=1, max_length=255)
status: str = "saved"
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class MixCalculatorSessionCreate(MixCalculatorSessionBase):
@@ -44,13 +45,14 @@ class MixCalculatorSessionCreate(MixCalculatorSessionBase):
class MixCalculatorSessionUpdate(BaseModel):
model_config = ConfigDict(extra="forbid")
mix_date: date | None = None
client_name: str | None = None
client_name: str | None = Field(default=None, min_length=1, max_length=255)
product_id: int | None = None
batch_size_kg: float | None = Field(default=None, gt=0)
prepared_by_name: str | None = Field(default=None, min_length=1, max_length=255)
status: str | None = None
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class MixCalculatorPreviewRead(BaseModel):
+17 -12
View File
@@ -4,33 +4,37 @@ from pydantic import BaseModel, ConfigDict, Field
class ProductCreate(BaseModel):
client_name: str
item_id: str | None = None
name: str
model_config = ConfigDict(extra="forbid")
client_name: str = Field(min_length=1, max_length=255)
item_id: str | None = Field(default=None, max_length=128)
name: str = Field(min_length=1, max_length=255)
mix_id: int
sale_type: str = "standard"
own_bag: bool = False
unit_of_measure: str = "20kg bag"
visible: bool = True
unit_of_measure: str = Field(default="20kg bag", min_length=1, max_length=64)
items_per_pallet: int = Field(default=50, gt=0)
bagging_process: str | None = None
bagging_process: str | None = Field(default=None, max_length=128)
distributor_margin: float | None = Field(default=None, gt=0, lt=1)
wholesale_margin: float | None = Field(default=None, gt=0, lt=1)
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class ProductUpdate(BaseModel):
client_name: str | None = None
item_id: str | None = None
name: str | None = None
model_config = ConfigDict(extra="forbid")
client_name: str | None = Field(default=None, min_length=1, max_length=255)
item_id: str | None = Field(default=None, max_length=128)
name: str | None = Field(default=None, min_length=1, max_length=255)
mix_id: int | None = None
sale_type: str | None = None
own_bag: bool | None = None
unit_of_measure: str | None = None
visible: bool | None = None
unit_of_measure: str | None = Field(default=None, min_length=1, max_length=64)
items_per_pallet: int | None = Field(default=None, gt=0)
bagging_process: str | None = None
bagging_process: str | None = Field(default=None, max_length=128)
distributor_margin: float | None = Field(default=None, gt=0, lt=1)
wholesale_margin: float | None = Field(default=None, gt=0, lt=1)
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class ProductRead(BaseModel):
@@ -43,6 +47,7 @@ class ProductRead(BaseModel):
mix_name: str
sale_type: str
own_bag: bool
visible: bool
unit_of_measure: str
items_per_pallet: int
bagging_process: str | None
+11 -9
View File
@@ -4,11 +4,12 @@ from pydantic import BaseModel, ConfigDict, Field
class RawMaterialPriceVersionCreate(BaseModel):
model_config = ConfigDict(extra="forbid")
market_value: float = Field(gt=0)
waste_percentage: float = Field(ge=0, default=0.0)
effective_date: date
status: str = "active"
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class RawMaterialPriceVersionRead(RawMaterialPriceVersionCreate):
@@ -21,21 +22,23 @@ class RawMaterialPriceVersionRead(RawMaterialPriceVersionCreate):
class RawMaterialCreate(BaseModel):
name: str
supplier: str | None = None
unit_of_measure: str
model_config = ConfigDict(extra="forbid")
name: str = Field(min_length=1, max_length=255)
supplier: str | None = Field(default=None, max_length=255)
unit_of_measure: str = Field(min_length=1, max_length=64)
kg_per_unit: float = Field(gt=0)
status: str = "active"
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
initial_price: RawMaterialPriceVersionCreate
class RawMaterialUpdate(BaseModel):
supplier: str | None = None
unit_of_measure: str | None = None
model_config = ConfigDict(extra="forbid")
supplier: str | None = Field(default=None, max_length=255)
unit_of_measure: str | None = Field(default=None, min_length=1, max_length=64)
kg_per_unit: float | None = Field(default=None, gt=0)
status: str | None = None
notes: str | None = None
notes: str | None = Field(default=None, max_length=2000)
class RawMaterialRead(BaseModel):
@@ -50,4 +53,3 @@ class RawMaterialRead(BaseModel):
created_at: datetime
current_price: RawMaterialPriceVersionRead | None
model_config = ConfigDict(from_attributes=True)
+3 -2
View File
@@ -6,8 +6,9 @@ from app.schemas.product import ProductCostBreakdown
class ScenarioCreate(BaseModel):
name: str
description: str | None = None
model_config = ConfigDict(extra="forbid")
name: str = Field(min_length=1, max_length=255)
description: str | None = Field(default=None, max_length=2000)
overrides: dict = Field(default_factory=dict)