Files
litestar-machines-test/app/domain/asset_item.py
Eden Kirin c7060c7ed3 Asset items
2023-08-27 23:13:24 +02:00

80 lines
2.4 KiB
Python

from __future__ import annotations
from datetime import datetime
from typing import Annotated, Optional
import sqlalchemy
from litestar.contrib.sqlalchemy.base import BigIntBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.dto import DTOConfig, MsgspecDTO
from msgspec import Struct, Meta
from sqlalchemy.orm import Mapped, mapped_column
from app.domain.enums import AssetItemProductLineEnum, AssetItemStatusEnum
from app.lib import service
from app.lib.company_owned_repository import CompanyOwnedRepository
class AssetItem(BigIntBase):
__tablename__ = "asset_items" # type: ignore[assignment]
company_id: Mapped[int]
product_line: Mapped[AssetItemProductLineEnum] = mapped_column(
sqlalchemy.Enum(AssetItemProductLineEnum, name="asset_product_line_enum")
)
brand_id: Mapped[int]
model_id: Mapped[int]
serial_number: Mapped[str]
external_id: Mapped[Optional[str]]
alive: Mapped[bool]
status: Mapped[AssetItemStatusEnum] = mapped_column(
sqlalchemy.Enum(AssetItemStatusEnum, name="asset_status_enum")
)
created_by_id: Mapped[Optional[int]]
created_at: Mapped[datetime]
last_modified_by_id: Mapped[Optional[int]]
last_modified_at: Mapped[datetime]
is_fiscal_device: Mapped[bool]
warehouse_id: Mapped[Optional[int]]
PositiveInt = Annotated[int, Meta(gt=0)]
class AssetItemWriteStruct(Struct):
company_id: PositiveInt
product_line: AssetItemProductLineEnum
brand_id: PositiveInt
model_id: PositiveInt
serial_number: Annotated[str, Meta(max_length=10)]
external_id: Annotated[str, Meta(max_length=10)] | None
alive: bool
status: AssetItemStatusEnum
created_by_id: PositiveInt | None
created_at: datetime
last_modified_by_id: PositiveInt | None
last_modified_at: datetime | None
is_fiscal_device: bool
warehouse_id: PositiveInt | None
class XXAssetItemWriteDTO(MsgspecDTO[AssetItemWriteStruct]):
...
class Repository(CompanyOwnedRepository[AssetItem]):
model_type = AssetItem
alive_flag = "alive"
company_id_field = "company_id"
class Service(service.Service[AssetItem]):
repository_type = Repository
write_config = DTOConfig(exclude={"id"})
AssetItemWriteDTO = SQLAlchemyDTO[Annotated[AssetItem, write_config]]
# AssetItemWriteDTO = MsgspecDTO[AssetItemWriteStruct]
AssetItemReadDTO = SQLAlchemyDTO[AssetItem]