171 lines
4.2 KiB
Python
171 lines
4.2 KiB
Python
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 |