54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
from datetime import date
|
|
from decimal import Decimal
|
|
from typing import Annotated
|
|
|
|
from pydantic import (
|
|
BaseModel,
|
|
ConfigDict,
|
|
Field,
|
|
model_serializer,
|
|
)
|
|
|
|
from . import Daf, to_camel
|
|
from .sale_category import SaleCategoryLink
|
|
|
|
|
|
class BeerConsumptionReportItem(BaseModel):
|
|
date_: date
|
|
|
|
# dynamic fields (e.g., regular, nc, kot)
|
|
dynamic_amounts: Annotated[dict[str, Daf], Field(default_factory=dict)]
|
|
|
|
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
|
|
|
|
def __getitem__(self, item: str) -> Daf:
|
|
return self.dynamic_amounts.get(item, Decimal(0))
|
|
|
|
def __setitem__(self, key: str, value: Daf) -> None:
|
|
self.dynamic_amounts[key] = value
|
|
|
|
def __contains__(self, key: str) -> bool:
|
|
return key in self.dynamic_amounts
|
|
|
|
@model_serializer(mode="plain")
|
|
def custom_dump(self) -> dict: # type: ignore
|
|
base = {
|
|
"date": self.date_.strftime("%d-%b-%Y"),
|
|
}
|
|
# Merge dynamic fields
|
|
base.update(dict(self.dynamic_amounts.items())) # type: ignore
|
|
return base
|
|
|
|
|
|
class BeerConsumptionReport(BaseModel):
|
|
start_date: date
|
|
finish_date: date
|
|
sale_category: SaleCategoryLink | None
|
|
regular: bool | None
|
|
happy: bool | None
|
|
staff: bool | None
|
|
nc: bool | None
|
|
headers: list[str]
|
|
data: list[BeerConsumptionReportItem]
|
|
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
|