from sqlmodel import Field, SQLModel, Relationship from enum import StrEnum from typing import Optional import datetime class UserBase(SQLModel): name: str email: str class UserPublic(UserBase): id: int class User(UserBase, table=True): id: int | None = Field(default=None, primary_key=True) class UserUpdate(SQLModel): name: str | None email: str | None class UserCreate(UserBase): pass class ProductorBase(SQLModel): name: str address: str payment: str type: str class ProductorPublic(ProductorBase): id: int products: list["Product"] = [] class Productor(ProductorBase, table=True): id: int | None = Field(default=None, primary_key=True) products: list["Product"] = Relationship(back_populates='productor') class ProductorUpdate(SQLModel): name: str | None address: str | None payment: str | None type: str | None class ProductorCreate(ProductorBase): pass class Unit(StrEnum): GRAMS = "1" KILO = "2" PIECE = "3" class ProductType(StrEnum): PLANNED = "1" RECCURENT = "2" class ShipmentProductLink(SQLModel, table=True): shipment_id: Optional[int] = Field(default=None, foreign_key="shipment.id", primary_key=True) product_id: Optional[int] = Field(default=None, foreign_key="product.id", primary_key=True) class ProductBase(SQLModel): name: str unit: Unit price: float price_kg: float | None weight: float | None type: ProductType productor_id: int | None = Field(default=None, foreign_key="productor.id") class ProductPublic(ProductBase): id: int productor: Productor | None shipments: list["Shipment"] | None class Product(ProductBase, table=True): id: int | None = Field(default=None, primary_key=True) shipments: list["Shipment"] = Relationship(back_populates="products", link_model=ShipmentProductLink) productor: Optional[Productor] = Relationship(back_populates="products") class ProductUpdate(SQLModel): name: str | None unit: Unit | None price: float | None price_kg: float | None weight: float | None productor_id: int | None shipment_ids: list[int] | None = [] class ProductCreate(ProductBase): shipment_ids: list[int] | None = [] class FormBase(SQLModel): name: str productor_id: int | None = Field(default=None, foreign_key="productor.id") referer_id: int | None = Field(default=None, foreign_key="user.id") season: str start: datetime.date end: datetime.date class FormPublic(FormBase): id: int productor: ProductorPublic | None referer: User | None shipments: list["Shipment"] = [] class Form(FormBase, table=True): id: int | None = Field(default=None, primary_key=True) productor: Optional['Productor'] = Relationship() referer: Optional['User'] = Relationship() shipments: list["Shipment"] = Relationship(cascade_delete=True) class FormUpdate(SQLModel): name: str | None productor_id: int | None referer_id: int | None season: str | None start: datetime.date | None end: datetime.date | None class FormCreate(FormBase): pass class TemplateBase(SQLModel): pass class TemplatePublic(TemplateBase): id: int class Template(TemplateBase, table=True): id: int | None = Field(default=None, primary_key=True) class TemplateUpdate(SQLModel): pass class TemplateCreate(TemplateBase): pass class ContractBase(SQLModel): pass class ContractPublic(ContractBase): id: int class Contract(ContractBase, table=True): id: int | None = Field(default=None, primary_key=True) class ContractUpdate(SQLModel): pass class ContractCreate(ContractBase): pass class ShipmentBase(SQLModel): name: str date: datetime.date form_id: int | None = Field(default=None, foreign_key="form.id", ondelete="CASCADE") class ShipmentPublic(ShipmentBase): id: int products: list[Product] = [] class Shipment(ShipmentBase, table=True): id: int | None = Field(default=None, primary_key=True) products: list[Product] = Relationship(back_populates="shipments", link_model=ShipmentProductLink) class ShipmentUpdate(SQLModel): name: str | None date: str | None product_ids: list[int] = [] class ShipmentCreate(ShipmentBase): product_ids: list[int] | None