Schemas everywhere mypy and ruff fully compliant

Type hints everywhere
This commit is contained in:
tanshu committed 2026-02-11 04:41:22 +00:00
1 parent dc34a78e06
commit e7e49019c4
45 files changed
+298 -166

No files matched your search

+1 -1
View File
@@ -28,7 +28,7 @@ class ModifierCategory:
sort_order: Mapped[int] = mapped_column(Integer, nullable=False)
products: Mapped[list[Product]] = relationship(
secondary=ModifierCategoryProduct.__table__,
secondary=ModifierCategoryProduct.__table__, # type: ignore[attr-defined]
back_populates="modifier_categories",
)
modifiers: Mapped[list[Modifier]] = relationship(back_populates="modifier_category")
+1 -1
View File
@@ -23,7 +23,7 @@ class Permission:
name: Mapped[str] = mapped_column(Text, unique=True, nullable=False)
roles: Mapped[list[Role]] = relationship(
secondary=RolePermission.__table__,
secondary=RolePermission.__table__, # type: ignore[attr-defined]
back_populates="permissions",
)
+1 -1
View File
@@ -26,7 +26,7 @@ class Product:
skus: Mapped[list[StockKeepingUnit]] = relationship("StockKeepingUnit", back_populates="product")
modifier_categories: Mapped[list[ModifierCategory]] = relationship(
"ModifierCategory",
secondary=ModifierCategoryProduct.__table__,
secondary=ModifierCategoryProduct.__table__, # type: ignore[attr-defined]
order_by="ModifierCategory.sort_order",
back_populates="products",
)
+1 -1
View File
@@ -24,7 +24,7 @@ class Role:
permissions: Mapped[list[Permission]] = relationship(
"Permission",
secondary=RolePermission.__table__,
secondary=RolePermission.__table__, # type: ignore[attr-defined]
back_populates="roles",
)
+1 -1
View File
@@ -28,7 +28,7 @@ class User:
roles: Mapped[list[Role]] = relationship(
"Role",
secondary=UserRole.__table__,
secondary=UserRole.__table__, # type: ignore[attr-defined]
order_by="Role.name",
)
login_history: Mapped[list[LoginHistory]] = relationship(order_by=desc(LoginHistory.date), back_populates="user")
+6 -6
View File
@@ -1,7 +1,7 @@
from datetime import UTC, date, datetime, timedelta
from typing import Any
from sqlalchemy import Label, and_, or_
from sqlalchemy import ColumnElement, Label, and_, or_
from ..core.config import settings
from ..models.bundle_item import BundleItem
@@ -42,28 +42,28 @@ def dates_overlap(start1: date | None, end1: date | None, start2: date | None, e
return start1 <= end2 and start2 <= end1
def _pv_active(date_: date | Label[Any]):
def _pv_active(date_: date | Label[Any]) -> ColumnElement[bool]:
return and_(
or_(ProductVersion.valid_from == None, ProductVersion.valid_from <= date_), # noqa: E711
or_(ProductVersion.valid_till == None, ProductVersion.valid_till >= date_), # noqa: E711
)
def _sv_active(date_: date | Label[Any]):
def _sv_active(date_: date | Label[Any]) -> ColumnElement[bool]:
return and_(
or_(SkuVersion.valid_from == None, SkuVersion.valid_from <= date_), # noqa: E711
or_(SkuVersion.valid_till == None, SkuVersion.valid_till >= date_), # noqa: E711
)
def _bundle_active(date_: date):
def _bundle_active(date_: date) -> ColumnElement[bool]:
return and_(
or_(BundleItem.valid_from == None, BundleItem.valid_from <= date_), # noqa: E711
or_(BundleItem.valid_till == None, BundleItem.valid_till >= date_), # noqa: E711
)
def _pv_onclause(date_: date | Label[Any]):
def _pv_onclause(date_: date | Label[Any]) -> ColumnElement[bool]:
return and_(
ProductVersion.product_id == Product.id,
or_(
@@ -77,7 +77,7 @@ def _pv_onclause(date_: date | Label[Any]):
)
def _sv_onclause(date_: date | Label[Any]):
def _sv_onclause(date_: date | Label[Any]) -> ColumnElement[bool]:
return and_(
SkuVersion.sku_id == StockKeepingUnit.id,
or_(SkuVersion.valid_from == None, SkuVersion.valid_from <= date_), # noqa: E711
+2 -1
View File
@@ -9,6 +9,7 @@ from ..db.session import SessionFuture
from ..models.device import Device
from ..models.login_history import LoginHistory
from ..schemas import device as schemas
from ..schemas.section import SectionLink
from ..schemas.user_token import UserToken
@@ -74,7 +75,7 @@ def device_info(item: Device) -> schemas.Device:
id_=item.id,
name=item.name,
enabled=item.enabled,
section=schemas.SectionLink(id_=item.section_id, name=item.section.name),
section=SectionLink(id_=item.section_id, name=item.section.name),
creation_date=item.creation_date,
last_user=item.login_history[0].user.name if len(item.login_history) else "Never",
last_date=item.login_history[0].date if len(item.login_history) else None,
+8 -8
View File
@@ -5,29 +5,29 @@ from sqlalchemy.exc import SQLAlchemyError
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionFuture
from ..models.db_setting import DbSetting
from ..schemas import header_footer as schemas
from ..schemas.header_footer import HeaderFooter
from ..schemas.user_token import UserToken
router = APIRouter()
@router.get("")
@router.get("", response_model=list[HeaderFooter])
def get(
user: UserToken = Security(get_user, scopes=["owner"]),
):
) -> list[HeaderFooter]:
with SessionFuture() as db:
return [
{"id": item.id, "name": item.name, "text": item.data["Text"]}
HeaderFooter(id_=item.id, name=item.name, text=item.data["Text"])
for item in db.execute(select(DbSetting).where(DbSetting.name.in_(["Header", "Footer"]))).scalars().all()
]
@router.post("")
@router.post("", response_model=list[HeaderFooter])
def save(
data: schemas.HeaderFooter,
data: HeaderFooter,
user: UserToken = Security(get_user, scopes=["owner"]),
):
) -> list[HeaderFooter]:
try:
with SessionFuture() as db:
item: DbSetting = db.execute(
@@ -36,7 +36,7 @@ def save(
item.data = {"Text": data.text}
db.commit()
return [
{"id": item.id, "name": item.name, "text": item.data["Text"]}
HeaderFooter(id_=item.id, name=item.name, text=item.data["Text"])
for item in db.execute(select(DbSetting).where(DbSetting.name.in_(["Header", "Footer"])))
.scalars()
.all()
+4 -3
View File
@@ -2,16 +2,17 @@ from fastapi import APIRouter, HTTPException
from sqlalchemy import text
from ..db.session import SessionFuture
from ..schemas.health_response import HealthResponse
router = APIRouter()
@router.get("")
def health_check():
@router.get("", response_model=HealthResponse)
def health_check() -> HealthResponse:
try:
with SessionFuture() as db: # lightweight DB check
db.execute(text("SELECT 1"))
return {"status": "ok", "database": "connected"}
return HealthResponse(status="ok", database="connected")
except Exception as e:
raise HTTPException(status_code=500, detail={"status": "error", "database": str(e)}) from e
+2 -1
View File
@@ -10,6 +10,7 @@ from ..core.security import get_current_active_user as get_user
from ..db.session import SessionFuture
from ..models.modifier import Modifier
from ..schemas import modifier as schemas
from ..schemas.modifier_category import ModifierCategoryLink
from ..schemas.user_token import UserToken
@@ -111,7 +112,7 @@ def modifier_info(item: Modifier) -> schemas.Modifier:
show_in_bill=item.show_in_bill,
price=item.price,
is_active=item.is_active,
modifier_category=schemas.ModifierCategoryLink(
modifier_category=ModifierCategoryLink(
id_=item.modifier_category.id,
name=item.modifier_category.name,
),
+5 -4
View File
@@ -18,7 +18,8 @@ from ..models.sku_version import SkuVersion
from ..models.stock_keeping_unit import StockKeepingUnit
from ..schemas import modifier_category as schemas
from ..schemas.menu_category import MenuCategoryLink
from ..schemas.modifier_category_for_product import ModifierCategoryForProduct, ModifierLink
from ..schemas.modifier import ModifierLink
from ..schemas.modifier_category_for_product import ModifierCategoryForProduct
from ..schemas.product_link import ProductLink
from ..schemas.product_link import ProductLink as ProductLinkSchema
from ..schemas.user_token import UserToken
@@ -172,7 +173,7 @@ def show_list(
is_active=item.is_active,
sort_order=item.sort_order,
menu_categories=[
schemas.MenuCategoryLink(
MenuCategoryLink(
id_=mc.id,
name=mc.name,
enabled=reduce(lambda x, y: x and (y.sku.product_id in products), mc.skus, True),
@@ -283,7 +284,7 @@ def modifier_category_info(item: ModifierCategory, date_: date, db: Session) ->
maximum=item.maximum,
is_active=item.is_active,
menu_categories=[
schemas.MenuCategoryLink(
MenuCategoryLink(
id_=mc.id,
name=mc.name,
skus=[
@@ -354,7 +355,7 @@ def modifier_category_blank(date_: date, db: Session) -> schemas.ModifierCategor
maximum=0,
is_active=True,
menu_categories=[
schemas.MenuCategoryLink(
MenuCategoryLink(
id_=mc.id,
name=mc.name,
skus=[
+3 -2
View File
@@ -29,6 +29,7 @@ from ..schemas import product as schemas
from ..schemas.menu_category import MenuCategoryLink
from ..schemas.product_query import BundleItemQuery, ProductQuery
from ..schemas.sale_category import SaleCategoryLink
from ..schemas.stock_keeping_unit import StockKeepingUnit as StockKeepingUnitSchema
from ..schemas.tax import TaxLink
from ..schemas.user_token import UserToken
from . import _pv_onclause, _sv_onclause, effective_date
@@ -610,12 +611,12 @@ def product_info(version: ProductVersion) -> schemas.Product:
version_id=version.id,
name=version.name,
fraction_units=version.fraction_units,
sale_category=schemas.SaleCategoryLink(
sale_category=SaleCategoryLink(
id_=version.sale_category_id,
name=version.sale_category.name,
),
skus=[
schemas.StockKeepingUnit(
StockKeepingUnitSchema(
id_=sku.id,
units=sku_version.units,
fraction=sku_version.fraction,
@@ -21,7 +21,8 @@ from ...models.stock_keeping_unit import StockKeepingUnit
from ...models.voucher import Voucher
from ...models.voucher_type import VoucherType
from ...printing.product_sale_report import print_product_sale_report
from ...schemas.product_sale_report import ProductSaleReport, ProductSaleReportItem, UserLink
from ...schemas.product_sale_report import ProductSaleReport, ProductSaleReportItem
from ...schemas.user import UserLink
from ...schemas.user_token import UserToken
from .. import _pv_onclause, _sv_onclause
from . import check_audit_permission, report_finish_date, report_start_date
@@ -1,6 +1,6 @@
from datetime import date, timedelta
from fastapi import APIRouter, Depends, Security
from fastapi import APIRouter, Depends, HTTPException, Security, status
from sqlalchemy import and_, nullsfirst, or_, select
from sqlalchemy.orm import Session, contains_eager
@@ -11,6 +11,7 @@ from ...models.product import Product
from ...models.product_version import ProductVersion
from ...models.sku_version import SkuVersion
from ...models.stock_keeping_unit import StockKeepingUnit
from ...schemas.product_updates_report import ProductUpdatesReport
from ...schemas.user_token import UserToken
from . import report_finish_date, report_start_date
@@ -18,21 +19,24 @@ from . import report_finish_date, report_start_date
router = APIRouter()
@router.get("")
@router.get("", response_model=ProductUpdatesReport)
def product_updates_report_view(
start_date: date = Depends(report_start_date),
finish_date: date = Depends(report_finish_date),
user: UserToken = Security(get_user, scopes=["product-sale-report"]),
):
) -> ProductUpdatesReport:
try:
with SessionFuture() as db:
return {
"startDate": start_date.strftime("%d-%b-%Y"),
"finishDate": finish_date.strftime("%d-%b-%Y"),
"report": product_updates_report(start_date, finish_date, db),
}
return ProductUpdatesReport(
start_date=start_date,
finish_date=finish_date,
report=product_updates_report(start_date, finish_date, db),
)
except Exception as e:
return {"error": str(e)}
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=str(e),
)
def product_updates_report(start_date: date, finish_date: date, db: Session) -> list[str]:
+2 -2
View File
@@ -119,7 +119,7 @@ def role_info(item: Role, db: Session) -> schemas.Role:
id_=item.id,
name=item.name,
permissions=[
schemas.PermissionItem(
PermissionItem(
id_=p.id,
name=p.name,
enabled=p in item.permissions,
@@ -133,7 +133,7 @@ def role_blank(db: Session) -> schemas.RoleBlank:
return schemas.RoleBlank(
name="",
permissions=[
schemas.PermissionItem(id_=p.id, name=p.name, enabled=False)
PermissionItem(id_=p.id, name=p.name, enabled=False)
for p in db.execute(select(Permission).order_by(Permission.name)).scalars().all()
],
)
+2 -1
View File
@@ -13,6 +13,7 @@ from ..db.session import SessionFuture
from ..models.product_version import ProductVersion
from ..models.sale_category import SaleCategory
from ..schemas import sale_category as schemas
from ..schemas.tax import TaxLink
from ..schemas.user_token import UserToken
@@ -118,7 +119,7 @@ def sale_category_info(item: SaleCategory) -> schemas.SaleCategory:
id_=item.id,
name=item.name,
discount_limit=item.discount_limit,
tax=schemas.TaxLink(id_=item.tax_id, name=item.tax.name, rate=item.tax.rate),
tax=TaxLink(id_=item.tax_id, name=item.tax.name, rate=item.tax.rate),
)
+4 -2
View File
@@ -13,6 +13,8 @@ from ..db.session import SessionFuture
from ..models.sale_category import SaleCategory
from ..models.section_printer import SectionPrinter
from ..schemas import section_printer as schemas
from ..schemas.printer import PrinterLink
from ..schemas.sale_category import SaleCategoryLink
from ..schemas.user_token import UserToken
@@ -126,8 +128,8 @@ def report(section_id: uuid.UUID | None, db: Session) -> list[schemas.SectionPri
)
list_.append(
schemas.SectionPrinter(
sale_category=None if sc_id is None else schemas.SaleCategoryLink(id_=sc_id, name=sc_name),
printer=None if section_printer is None else schemas.PrinterLink(id_=section_printer.printer_id),
sale_category=None if sc_id is None else SaleCategoryLink(id_=sc_id, name=sc_name),
printer=None if section_printer is None else PrinterLink(id_=section_printer.printer_id),
copies=0 if section_printer is None else section_printer.copies,
)
)
+4 -3
View File
@@ -6,17 +6,18 @@ from sqlalchemy import select
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionFuture
from ..models.db_setting import DbSetting
from ..schemas.db_setting import DbSetting as DbSettingSchema
from ..schemas.user_token import UserToken
router = APIRouter()
@router.get("/{id_}")
@router.get("/{id_}", response_model=DbSettingSchema)
def get(
id_: uuid.UUID,
user: UserToken = Security(get_user),
):
) -> DbSettingSchema:
with SessionFuture() as db:
data = db.execute(select(DbSetting).where(DbSetting.name == id_)).scalar_one()
return {"id": data.id, "name": data.name, "details": data.data}
return DbSettingSchema(id_=data.id, name=data.name, details=data.data)
+22 -22
View File
@@ -12,6 +12,8 @@ from ..db.session import SessionFuture
from ..models.food_table import FoodTable
from ..models.overview import Overview
from ..schemas import table as schemas
from ..schemas.running_table import RunningTable
from ..schemas.section import SectionLink
from ..schemas.user_token import UserToken
@@ -33,7 +35,7 @@ def sort_order(
id_=item.id,
name=item.name,
seats=item.seats,
section=schemas.SectionLink(id_=item.section_id, name=item.section.name),
section=SectionLink(id_=item.section_id, name=item.section.name),
is_active=item.is_active,
sort_order=item.sort_order,
)
@@ -125,8 +127,8 @@ def show_list(user: UserToken = Depends(get_user)) -> list[schemas.Table]:
]
@router.get("/running")
def show_running(user: UserToken = Depends(get_user)):
@router.get("/running", response_model=list[RunningTable])
def show_running(user: UserToken = Depends(get_user)) -> list[RunningTable]:
with SessionFuture() as db:
list_ = (
db.execute(
@@ -136,27 +138,25 @@ def show_running(user: UserToken = Depends(get_user)):
.all()
)
food_tables = []
food_tables: list[RunningTable] = []
for item in list_:
ft = {
"id": item.id,
"name": item.name,
"seats": item.seats,
"section": {"id": item.section_id, "name": item.section.name},
"isActive": item.is_active,
"sortOrder": item.sort_order,
}
if item.status is not None:
ft["status"] = item.status.status
ft["voucherId"] = item.status.voucher_id
ft["pax"] = item.status.voucher.pax
ft["date"] = (item.status.voucher.date + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime(
"%d-%b-%Y %H:%M"
ft = RunningTable(
id_=item.id,
name=item.name,
seats=item.seats,
section=SectionLink(id_=item.section_id, name=item.section.name),
is_active=item.is_active,
sort_order=item.sort_order,
)
ft["amount"] = round(item.status.voucher.amount, 0)
if item.status is not None:
ft.status = item.status.status
ft.voucher_id = item.status.voucher_id
ft.pax = item.status.voucher.pax
ft.date_ = item.status.voucher.date + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)
ft.amount = int(round(item.status.voucher.amount, 0))
if item.status.guest is not None:
ft["guest"] = item.status.guest.customer.name
ft["bold"] = item.status.guest.customer.print_in_bill
ft.guest = item.status.guest.customer.name
ft.bold = item.status.guest.customer.print_in_bill
food_tables.append(ft)
return food_tables
@@ -188,7 +188,7 @@ def food_table_info(item: FoodTable) -> schemas.Table:
id_=item.id,
name=item.name,
seats=item.seats,
section=schemas.SectionLink(id_=item.section_id, name=item.section.name),
section=SectionLink(id_=item.section_id, name=item.section.name),
is_active=item.is_active,
sort_order=item.sort_order,
)
+2 -1
View File
@@ -14,6 +14,7 @@ from ..models.inventory import Inventory
from ..models.sale_category import SaleCategory
from ..models.tax import Tax
from ..schemas import tax as schemas
from ..schemas.regime import RegimeLink
from ..schemas.user_token import UserToken
@@ -129,7 +130,7 @@ def tax_info(item: Tax) -> schemas.Tax:
id_=item.id,
name=item.name,
rate=item.rate,
regime=schemas.RegimeLink(id_=item.regime_id, name=item.regime.name),
regime=RegimeLink(id_=item.regime_id, name=item.regime.name),
is_fixture=item.is_fixture,
)
+2 -2
View File
@@ -102,14 +102,14 @@ def check_gaps(data: TemporalProduct, db: Session) -> None:
detail="Product and SKU versions validity do not match",
)
for i, p_item in enumerate(data.products[1:], start=1):
if data.products[i - 1].valid_till + timedelta(days=1) != p_item.valid_from:
if data.products[i - 1].valid_till + timedelta(days=1) != p_item.valid_from: # type: ignore[operator]
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="Gaps in product versions exist",
)
for sku_list in skus.values():
for i, s_item in enumerate(sku_list[1:], start=1):
if sku_list[i - 1].valid_till + timedelta(days=1) != s_item.valid_from:
if sku_list[i - 1].valid_till + timedelta(days=1) != s_item.valid_from: # type: ignore[operator]
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="Gaps in sku versions exist",
+2 -2
View File
@@ -166,7 +166,7 @@ def user_info(item: User, db: Session, user: UserToken) -> schemas.User:
password="",
locked_out=item.locked_out,
roles=[
schemas.RoleItem(
RoleItem(
id_=r.id,
name=r.name,
enabled=r in item.roles,
@@ -194,7 +194,7 @@ def blank_user_info(db: Session) -> schemas.UserIn:
password="",
locked_out=False,
roles=[
schemas.RoleItem(id_=r.id, name=r.name, enabled=False)
RoleItem(id_=r.id, name=r.name, enabled=False)
for r in db.execute(select(Role).order_by(Role.name)).scalars().all()
],
)
+9 -4
View File
@@ -4,7 +4,7 @@ from datetime import datetime
from decimal import Decimal
from fastapi import HTTPException, status
from sqlalchemy import func, select
from sqlalchemy import ColumnElement, func, select
from sqlalchemy.orm import Session, contains_eager
from sqlalchemy.sql import expression
@@ -188,7 +188,12 @@ def happy_hour_items_more_than_regular(kots: list[schemas.Kot]) -> bool:
return any(value["happy"] > value["normal"] for value in inventories.values())
def get_voucher(voucher_id: uuid.UUID, db: Session, product_version_onclause, sku_version_onclause) -> Voucher:
def get_voucher(
voucher_id: uuid.UUID,
db: Session,
product_version_onclause: ColumnElement[bool],
sku_version_onclause: ColumnElement[bool],
) -> Voucher:
item: Voucher = (
db.execute(
select(Voucher)
@@ -230,8 +235,8 @@ def get_voucher(voucher_id: uuid.UUID, db: Session, product_version_onclause, sk
def get_sku(
sku_id: uuid.UUID,
db: Session,
product_version_onclause,
sku_version_onclause,
product_version_onclause: ColumnElement[bool],
sku_version_onclause: ColumnElement[bool],
) -> StockKeepingUnit:
sku: StockKeepingUnit = (
db.execute(
+11 -11
View File
@@ -24,21 +24,21 @@ from ...models.sku_version import SkuVersion
from ...models.stock_keeping_unit import StockKeepingUnit
from ...models.voucher import Voucher
from ...models.voucher_type import VoucherType
from ...schemas.customer import CustomerLink
from ...schemas.modifier import ModifierLink
from ...schemas.table import TableLink
from ...schemas.tax import TaxLink
from ...schemas.user import UserLink
from ...schemas.user_token import UserToken
from ...schemas.voucher_out import (
CustomerLink,
InventoryProduct,
ModifierLink,
ProductMenuCategory,
ProductSaleCategory,
TableLink,
TaxLink,
UserLink,
VoucherBlank,
VoucherOut,
Inventory as InventoryOut,
)
from ...schemas.voucher_out import (
Inventory as InventoryOut,
InventoryProduct,
ProductMenuCategory,
ProductSaleCategory,
VoucherBlank,
VoucherOut,
)
from ...schemas.voucher_out import (
Kot as KotOut,
+2 -2
View File
@@ -4,7 +4,7 @@ from datetime import UTC, datetime, timedelta
from decimal import Decimal
from fastapi import APIRouter, HTTPException, Security, status
from sqlalchemy import Date, func, select
from sqlalchemy import ColumnElement, Date, func, select
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session, contains_eager
@@ -43,7 +43,7 @@ from ...schemas.user_token import UserToken
router = APIRouter()
def discount_limit(sku_id: uuid.UUID, db: Session, product_version_onclause) -> Decimal:
def discount_limit(sku_id: uuid.UUID, db: Session, product_version_onclause: ColumnElement[bool]) -> Decimal:
sku: StockKeepingUnit = (
db.execute(
select(StockKeepingUnit)
@@ -1,8 +1,16 @@
from datetime import date, datetime
from decimal import Decimal
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator, model_serializer
from pydantic import (
BaseModel,
ConfigDict,
Field,
SerializationInfo,
field_serializer,
field_validator,
model_serializer,
)
from . import Daf, to_camel
@@ -18,7 +26,7 @@ class BeerConsumptionReportItem(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("date_")
def serialize_date(self, value: date, _info: Any) -> str:
def serialize_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
# dynamic fields (e.g., regular, nc, kot)
@@ -64,7 +72,7 @@ class BeerConsumptionReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -75,5 +83,5 @@ class BeerConsumptionReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@@ -1,7 +1,6 @@
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
@@ -21,7 +20,7 @@ class BillSettlementItem(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("date_")
def serialize_date(self, value: datetime, _info: Any) -> str:
def serialize_date(self, value: datetime, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y %H:%M")
@@ -39,7 +38,7 @@ class BillSettlement(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -50,5 +49,5 @@ class BillSettlement(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+3 -4
View File
@@ -1,7 +1,6 @@
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
from .user import UserLink
@@ -60,7 +59,7 @@ class CashierReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -71,5 +70,5 @@ class CashierReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+19
View File
@@ -0,0 +1,19 @@
import uuid
from typing import Any
from pydantic import BaseModel, ConfigDict
from . import to_camel
class DbSetting(BaseModel):
id_: uuid.UUID
name: str
details: dict[str, Any]
model_config = ConfigDict(
str_strip_whitespace=True,
alias_generator=to_camel,
populate_by_name=True,
)
+4 -4
View File
@@ -1,9 +1,9 @@
import uuid
from datetime import datetime
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer
from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer
from . import to_camel
from .section import SectionLink
@@ -24,11 +24,11 @@ class Device(DeviceIn):
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_serializer("creation_date")
def serialize_creation_date(self, value: datetime, _info: Any) -> str:
def serialize_creation_date(self, value: datetime, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y %H:%M")
@field_serializer("last_date")
def serialize_last_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_last_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
+3 -4
View File
@@ -1,7 +1,6 @@
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
@@ -26,7 +25,7 @@ class DiscountReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -37,5 +36,5 @@ class DiscountReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+9 -8
View File
@@ -1,12 +1,13 @@
import uuid
from datetime import date, datetime
from typing import Annotated, Any
from typing import Annotated
from pydantic import (
BaseModel,
ConfigDict,
Field,
SerializationInfo,
field_serializer,
field_validator,
model_validator,
@@ -38,7 +39,7 @@ class GuestBookIn(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("booking_date")
def serialize_booking_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_booking_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
@field_validator("arrival_date", mode="before")
@@ -51,7 +52,7 @@ class GuestBookIn(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("arrival_date")
def serialize_arrival_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_arrival_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
@model_validator(mode="after")
@@ -75,7 +76,7 @@ class GuestBook(GuestBookIn):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("last_edit_date")
def serialize_last_edit_date(self, value: datetime, _info: Any) -> str:
def serialize_last_edit_date(self, value: datetime, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y %H:%M")
@@ -107,7 +108,7 @@ class GuestBookListItem(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("booking_date")
def serialize_booking_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_booking_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
@field_validator("arrival_date", mode="before")
@@ -120,7 +121,7 @@ class GuestBookListItem(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("arrival_date")
def serialize_arrival_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_arrival_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
@field_validator("last_edit_date", mode="before")
@@ -131,7 +132,7 @@ class GuestBookListItem(BaseModel):
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("last_edit_date")
def serialize_last_edit_date(self, value: datetime, _info: Any) -> str:
def serialize_last_edit_date(self, value: datetime, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y %H:%M")
@@ -148,5 +149,5 @@ class GuestBookList(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("date_")
def serialize_date(self, value: date, _info: Any) -> str:
def serialize_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+6
View File
@@ -0,0 +1,6 @@
from pydantic import BaseModel
class HealthResponse(BaseModel):
status: str
database: str
@@ -1,9 +1,8 @@
import uuid
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
@@ -37,7 +36,7 @@ class MeReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -48,5 +47,5 @@ class MeReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+4 -4
View File
@@ -1,9 +1,9 @@
import uuid
from datetime import date, datetime
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator
from . import to_camel
from .sale_category import SaleCategoryLink
@@ -37,7 +37,7 @@ class Product(ProductIn):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_from")
def serialize_valid_from(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@field_validator("valid_till", mode="before")
@@ -50,7 +50,7 @@ class Product(ProductIn):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_till")
def serialize_valid_till(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
+12 -4
View File
@@ -2,9 +2,17 @@ import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator, model_serializer
from pydantic import (
BaseModel,
ConfigDict,
Field,
SerializationInfo,
field_serializer,
field_validator,
model_serializer,
)
from . import Daf, to_camel
from .user import UserLink
@@ -57,7 +65,7 @@ class ProductSaleReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -68,5 +76,5 @@ class ProductSaleReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@@ -0,0 +1,35 @@
from datetime import date, datetime
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import to_camel
class ProductUpdatesReport(BaseModel):
start_date: date
finish_date: date
report: list[str]
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_validator("start_date", mode="before")
@classmethod
def parse_start_date(cls, value: str | date) -> date:
if isinstance(value, date):
return value
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@classmethod
def parse_finish_date(cls, value: str | date) -> date:
if isinstance(value, date):
return value
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+43
View File
@@ -0,0 +1,43 @@
import uuid
from datetime import datetime
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import to_camel
from .section import SectionLink
class RunningTable(BaseModel):
id_: uuid.UUID
name: str
seats: int
section: SectionLink
is_active: bool
sort_order: int
# present only when status exists in DB
status: str | None = None
voucher_id: uuid.UUID | None = None
pax: int | None = None
date_: datetime | None = None
amount: float | None = None # you round to 0 decimals; keep Decimal if you prefer
guest: str | None = None
bold: bool | None = None
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_validator("date_", mode="before")
@classmethod
def parse_date(cls, value: str | datetime | None) -> datetime | None:
if value is None:
return None
if isinstance(value, datetime):
return value
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("date_")
def serialize_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
if value is None:
return None
return value.strftime("%d-%b-%Y %H:%M")
+3 -4
View File
@@ -1,9 +1,8 @@
import uuid
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
from .user import UserLink
@@ -31,7 +30,7 @@ class SaleReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -42,5 +41,5 @@ class SaleReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+4 -4
View File
@@ -2,9 +2,9 @@ import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
from .menu_category import MenuCategoryLink
@@ -38,7 +38,7 @@ class StockKeepingUnit(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_from")
def serialize_valid_from(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@field_validator("valid_till", mode="before")
@@ -51,5 +51,5 @@ class StockKeepingUnit(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_till")
def serialize_valid_till(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
+3 -4
View File
@@ -1,7 +1,6 @@
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
@@ -28,7 +27,7 @@ class TaxReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("start_date")
def serialize_start_date(self, value: date, _info: Any) -> str:
def serialize_start_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("finish_date", mode="before")
@@ -39,5 +38,5 @@ class TaxReport(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("finish_date")
def serialize_finish_date(self, value: date, _info: Any) -> str:
def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+6 -6
View File
@@ -2,9 +2,9 @@ import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Annotated, Any
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
from .menu_category import MenuCategoryLink
@@ -33,7 +33,7 @@ class Product(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_from")
def serialize_valid_from(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@field_validator("valid_till", mode="before")
@@ -46,7 +46,7 @@ class Product(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_till")
def serialize_valid_till(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@@ -78,7 +78,7 @@ class StockKeepingUnit(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_from")
def serialize_valid_from(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@field_validator("valid_till", mode="before")
@@ -91,7 +91,7 @@ class StockKeepingUnit(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("valid_till")
def serialize_valid_till(self, value: date | None, _info: Any) -> str | None:
def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y")
@@ -1,9 +1,8 @@
import uuid
from datetime import date, datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer, field_validator
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator
from . import Daf, to_camel
@@ -30,5 +29,5 @@ class UpdateProductPrices(BaseModel):
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("date_")
def serialize_date(self, value: date, _info: Any) -> str:
def serialize_date(self, value: date, _info: SerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
+2 -3
View File
@@ -1,9 +1,8 @@
import uuid
from datetime import datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_serializer
from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer
from . import to_camel
from .role import RoleItem
@@ -44,5 +43,5 @@ class UserList(BaseModel):
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_serializer("last_date")
def serialize_last_date(self, value: datetime | None, _info: Any) -> str | None:
def serialize_last_date(self, value: datetime | None, _info: SerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
+8 -8
View File
@@ -4,7 +4,7 @@ from datetime import datetime, timedelta
from decimal import Decimal
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator, model_validator
from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator, model_validator
from ..core.config import settings
from ..models.inventory_type import InventoryType
@@ -110,7 +110,7 @@ class Kot(BaseModel):
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_serializer("date_")
def serialize_date(self, value: datetime, _info):
def serialize_date(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S")
@@ -149,25 +149,25 @@ class VoucherOut(BaseModel):
)
@field_serializer("date_")
def serialize_date(self, value: datetime, _info):
def serialize_date(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M")
@field_serializer("date_tip")
def serialize_date_tip(self, value: datetime, _info):
def serialize_date_tip(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S")
@field_serializer("creation_date")
def serialize_creation_date(self, value: datetime, _info):
def serialize_creation_date(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M")
@field_serializer("creation_date_tip")
def serialize_creation_date_tip(self, value: datetime, _info):
def serialize_creation_date_tip(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S")
@field_serializer("last_edit_date")
def serialize_last_edit_date(self, value: datetime, _info):
def serialize_last_edit_date(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M")
@field_serializer("last_edit_date_tip")
def serialize_last_edit_date_tip(self, value: datetime, _info):
def serialize_last_edit_date_tip(self, value: datetime, _info: SerializationInfo) -> str:
return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S")