Schemas everywhere mypy and ruff fully compliant
Type hints everywhere
This commit is contained in:
1 parent
dc34a78e06
commit
e7e49019c4
45 files changed
+298
-166
No files matched your search
@@ -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")
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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,
|
||||
),
|
||||
|
||||
@@ -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=[
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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()
|
||||
],
|
||||
)
|
||||
|
||||
@@ -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),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
@@ -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,
|
||||
}
|
||||
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,
|
||||
)
|
||||
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["amount"] = round(item.status.voucher.amount, 0)
|
||||
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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()
|
||||
],
|
||||
)
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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")
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
Reference in new issue
Block a user