Files
barker/barker/barker/schemas/beer_consumption_report.py
T

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)