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