diff --git a/barker/barker/core/security.py b/barker/barker/core/security.py index a88fee5..1e80976 100644 --- a/barker/barker/core/security.py +++ b/barker/barker/core/security.py @@ -17,7 +17,7 @@ from ..models.auth import Device from ..models.auth import User as UserModel # to get a string like this run: -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token", scopes={}) diff --git a/barker/barker/main.py b/barker/barker/main.py index 5a7cce3..2c0f032 100644 --- a/barker/barker/main.py +++ b/barker/barker/main.py @@ -16,6 +16,7 @@ from .routers import ( modifier_category, printer, product, + role, sale_category, section, section_printer, @@ -23,10 +24,10 @@ from .routers import ( table, tax, update_product_prices, + user, ) -from .routers.auth import role, user from .routers.reports import ( - beer_consumption_report, + beer_sale_report, bill_settlement_report, cashier_report, discount_report, @@ -80,7 +81,7 @@ app.include_router(tax.router, prefix="/api/taxes", tags=["taxes"]) app.include_router(table.router, prefix="/api/tables", tags=["sections"]) app.include_router( - beer_consumption_report.router, + beer_sale_report.router, prefix="/api/beer-sale-report", tags=["reports"], ) diff --git a/barker/barker/routers/auth/__init__.py b/barker/barker/routers/auth/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/barker/barker/routers/auth/role.py b/barker/barker/routers/auth/role.py deleted file mode 100644 index def4cab..0000000 --- a/barker/barker/routers/auth/role.py +++ /dev/null @@ -1,163 +0,0 @@ -import uuid - -from typing import List - -import barker.schemas.auth as schemas - -from fastapi import APIRouter, Depends, HTTPException, Security, status -from sqlalchemy.exc import SQLAlchemyError -from sqlalchemy.orm import Session - -from ...core.security import get_current_active_user as get_user -from ...db.session import SessionLocal -from ...models.auth import Permission, Role -from ...schemas.auth import UserToken - - -router = APIRouter() - - -# Dependency -def get_db(): - try: - db = SessionLocal() - yield db - finally: - db.close() - - -@router.post("", response_model=schemas.Role) -def save( - data: schemas.RoleIn, - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> schemas.Role: - try: - item = Role(data.name) - db.add(item) - add_permissions(item, data.permissions, db) - db.commit() - return role_info(item, db) - except SQLAlchemyError as e: - db.rollback() - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=str(e), - ) - except Exception: - db.rollback() - raise - - -@router.put("/{id_}", response_model=schemas.Role) -def update( - id_: uuid.UUID, - data: schemas.RoleIn, - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> schemas.Role: - try: - item: Role = db.query(Role).filter(Role.id == id_).first() - item.name = data.name - add_permissions(item, data.permissions, db) - db.commit() - return role_info(item, db) - except SQLAlchemyError as e: - db.rollback() - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=str(e), - ) - except Exception: - db.rollback() - raise - - -def add_permissions(role: Role, permissions: List[schemas.PermissionItem], db): - for permission in permissions: - gp = [p for p in role.permissions if p.id == permission.id_] - gp = None if len(gp) == 0 else gp[0] - if permission.enabled and gp is None: - role.permissions.append(db.query(Permission).filter(Permission.id == permission.id_).one()) - elif not permission.enabled and gp: - role.permissions.remove(gp) - - -@router.delete("/{id_}", response_model=schemas.RoleIn) -def delete( - id_: uuid.UUID, - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> schemas.RoleIn: - try: - item: Role = db.query(Role).filter(Role.id == id_).first() - if item is None: - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Role not found", - ) - raise HTTPException( - status_code=status.HTTP_501_NOT_IMPLEMENTED, - detail="Role deletion not implemented", - ) - except Exception: - db.rollback() - raise - - -@router.get("", response_model=schemas.RoleIn) -def show_blank( - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> schemas.RoleIn: - return blank_role_info(db) - - -@router.get("/list", response_model=List[schemas.RoleList]) -async def show_list( - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> List[schemas.RoleList]: - return [ - schemas.RoleList( - id=item.id, - name=item.name, - permissions=[p.name for p in sorted(item.permissions, key=lambda p: p.name)], - ) - for item in db.query(Role).order_by(Role.name).all() - ] - - -@router.get("/{id_}", response_model=schemas.Role) -def show_id( - id_: uuid.UUID, - db: Session = Depends(get_db), - user: UserToken = Security(get_user, scopes=["users"]), -) -> schemas.Role: - item: Role = db.query(Role).filter(Role.id == id_).first() - return role_info(item, db) - - -def role_info(item: Role, db: Session) -> schemas.Role: - return schemas.Role( - id=item.id, - name=item.name, - permissions=[ - schemas.PermissionItem( - id=p.id, - name=p.name, - enabled=True if p in item.permissions else False, - ) - for p in db.query(Permission).order_by(Permission.name).all() - ], - ) - - -def blank_role_info(db: Session) -> schemas.RoleIn: - return schemas.RoleIn( - name="", - permissions=[ - schemas.PermissionItem(id=p.id, name=p.name, enabled=False) - for p in db.query(Permission).order_by(Permission.name).all() - ], - ) diff --git a/barker/barker/routers/customer.py b/barker/barker/routers/customer.py index 748f383..a52ef5d 100644 --- a/barker/barker/routers/customer.py +++ b/barker/barker/routers/customer.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import Customer -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/device.py b/barker/barker/routers/device.py index 0d65463..30ae897 100644 --- a/barker/barker/routers/device.py +++ b/barker/barker/routers/device.py @@ -10,8 +10,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.auth import Device -from ..schemas.auth import UserToken +from ..models.auth import Device, LoginHistory +from ..schemas.user_token import UserToken router = APIRouter() @@ -51,17 +51,17 @@ def update( raise -@router.delete("/{id_}", response_model=schemas.Device) +@router.delete("/{id_}") def delete( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["add-devices"]), -) -> schemas.Device: +): try: - item: Device = db.query(Device).filter(Device.id == id_).first() - db.delete(item) + db.execute(LoginHistory.__table__.delete(LoginHistory.device_id == id_)) + db.execute(Device.__table__.delete(Device.id == id_)) db.commit() - return device_info(item) + return {} except SQLAlchemyError as e: db.rollback() raise HTTPException( diff --git a/barker/barker/routers/guest_book.py b/barker/barker/routers/guest_book.py index 2451d55..3b9bb30 100644 --- a/barker/barker/routers/guest_book.py +++ b/barker/barker/routers/guest_book.py @@ -14,7 +14,7 @@ from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import Customer from ..models.voucher import GuestBook -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/header_footer.py b/barker/barker/routers/header_footer.py index 3a40ba1..b29e6b0 100644 --- a/barker/barker/routers/header_footer.py +++ b/barker/barker/routers/header_footer.py @@ -7,7 +7,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import DbSetting -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/login.py b/barker/barker/routers/login.py index 4ad2487..3eb9547 100644 --- a/barker/barker/routers/login.py +++ b/barker/barker/routers/login.py @@ -27,7 +27,7 @@ from ..core.security import ( ) from ..db.session import SessionLocal from ..models.auth import LoginHistory -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/menu_category.py b/barker/barker/routers/menu_category.py index 637df56..3348118 100644 --- a/barker/barker/routers/menu_category.py +++ b/barker/barker/routers/menu_category.py @@ -14,7 +14,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import MenuCategory, ProductVersion -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken from . import effective_date diff --git a/barker/barker/routers/modifier.py b/barker/barker/routers/modifier.py index 778263d..3df6619 100644 --- a/barker/barker/routers/modifier.py +++ b/barker/barker/routers/modifier.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import Modifier -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/modifier_category.py b/barker/barker/routers/modifier_category.py index c55281f..361ada8 100644 --- a/barker/barker/routers/modifier_category.py +++ b/barker/barker/routers/modifier_category.py @@ -15,7 +15,7 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import MenuCategory, ModifierCategory, Product, ProductVersion -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken from . import effective_date @@ -292,7 +292,7 @@ def modifier_category_blank(date_: date, db: Session) -> schemas.ModifierCategor id=mc.id, name=mc.name, enabled=False, - products=[ProductLinkSchema(id=p.id, name=p.name, enabled=False) for p in mc.products], + products=[ProductLinkSchema(id=p.product_id, name=p.name, enabled=False) for p in mc.products], ) for mc in menu_categories ], diff --git a/barker/barker/routers/printer.py b/barker/barker/routers/printer.py index 52f4e23..94d3974 100644 --- a/barker/barker/routers/printer.py +++ b/barker/barker/routers/printer.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import Printer -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/product.py b/barker/barker/routers/product.py index 3ba4c41..521ccd3 100644 --- a/barker/barker/routers/product.py +++ b/barker/barker/routers/product.py @@ -13,7 +13,7 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import MenuCategory, Product, ProductVersion, SaleCategory -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken from . import effective_date diff --git a/barker/barker/routers/reports/beer_consumption_report.py b/barker/barker/routers/reports/beer_sale_report.py similarity index 98% rename from barker/barker/routers/reports/beer_consumption_report.py rename to barker/barker/routers/reports/beer_sale_report.py index d8a3a12..90e0a57 100644 --- a/barker/barker/routers/reports/beer_consumption_report.py +++ b/barker/barker/routers/reports/beer_sale_report.py @@ -10,7 +10,7 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import ProductVersion, VoucherType from ...models.voucher import Inventory, Kot, Voucher -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/bill_settlement_report.py b/barker/barker/routers/reports/bill_settlement_report.py index eecddad..0d7725f 100644 --- a/barker/barker/routers/reports/bill_settlement_report.py +++ b/barker/barker/routers/reports/bill_settlement_report.py @@ -9,8 +9,8 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import ReportingLevel, SettleOption from ...models.voucher import Reprint, Settlement, Voucher -from ...schemas.auth import UserToken from ...schemas.bill_settlement_report import BillSettlement, BillSettlementItem +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/cashier_report.py b/barker/barker/routers/reports/cashier_report.py index 25f43fd..c068305 100644 --- a/barker/barker/routers/reports/cashier_report.py +++ b/barker/barker/routers/reports/cashier_report.py @@ -14,13 +14,14 @@ from ...models.auth import User from ...models.master import ReportingLevel from ...models.voucher import Settlement, Voucher from ...printing.cashier_report import print_cashier_report -from ...schemas.auth import UserLink, UserToken from ...schemas.cashier_report import ( CashierReport, InfoItem, NameAmount, SettleOptionSchema, ) +from ...schemas.user import UserLink +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/discount_report.py b/barker/barker/routers/reports/discount_report.py index 2318020..0e0ab5d 100644 --- a/barker/barker/routers/reports/discount_report.py +++ b/barker/barker/routers/reports/discount_report.py @@ -13,8 +13,8 @@ from ...db.session import SessionLocal from ...models.master import ProductVersion, SaleCategory, VoucherType from ...models.voucher import Inventory, Kot, Voucher from ...printing.discount_report import print_discount_report -from ...schemas.auth import UserToken from ...schemas.discount_report import DiscountReport, DiscountReportItem +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/product_sale_report.py b/barker/barker/routers/reports/product_sale_report.py index 17ed08d..21165a5 100644 --- a/barker/barker/routers/reports/product_sale_report.py +++ b/barker/barker/routers/reports/product_sale_report.py @@ -10,7 +10,7 @@ from ...db.session import SessionLocal from ...models.master import MenuCategory, ProductVersion, SaleCategory, VoucherType from ...models.voucher import Inventory, Kot, Voucher from ...schemas import to_camel -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/product_updates_report.py b/barker/barker/routers/reports/product_updates_report.py index 7af6668..2111d3e 100644 --- a/barker/barker/routers/reports/product_updates_report.py +++ b/barker/barker/routers/reports/product_updates_report.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import MenuCategory, ProductVersion -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/sale_report.py b/barker/barker/routers/reports/sale_report.py index a781f61..0aad662 100644 --- a/barker/barker/routers/reports/sale_report.py +++ b/barker/barker/routers/reports/sale_report.py @@ -13,8 +13,9 @@ from ...db.session import SessionLocal from ...models.master import ProductVersion, SaleCategory, SettleOption, VoucherType from ...models.voucher import Inventory, Kot, Settlement, Voucher from ...printing.sale_report import print_sale_report -from ...schemas.auth import UserLink, UserToken from ...schemas.sale_report import SaleReport, SaleReportItem +from ...schemas.user import UserLink +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date from .tax_report import get_tax diff --git a/barker/barker/routers/reports/tax_report.py b/barker/barker/routers/reports/tax_report.py index 8942dac..243f0d9 100644 --- a/barker/barker/routers/reports/tax_report.py +++ b/barker/barker/routers/reports/tax_report.py @@ -10,8 +10,8 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import Tax, VoucherType from ...models.voucher import Inventory, Kot, Voucher -from ...schemas.auth import UserToken from ...schemas.tax_report import TaxReport, TaxReportItem +from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/role.py b/barker/barker/routers/role.py index 98ed35e..9c8ff1d 100644 --- a/barker/barker/routers/role.py +++ b/barker/barker/routers/role.py @@ -1,8 +1,8 @@ import uuid -from typing import List, Optional +from typing import List -import barker.schemas.auth as schemas +import barker.schemas.role as schemas from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy.exc import SQLAlchemyError @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.auth import Permission, Role -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() @@ -31,7 +31,7 @@ def save( data: schemas.RoleIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): +) -> schemas.Role: try: item = Role(data.name) db.add(item) @@ -55,7 +55,7 @@ def update( data: schemas.RoleIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): +) -> schemas.Role: try: item: Role = db.query(Role).filter(Role.id == id_).first() item.name = data.name @@ -73,22 +73,12 @@ def update( raise -def add_permissions(role: Role, permissions: List[schemas.PermissionItem], db): - for permission in permissions: - gp = [p for p in role.permissions if p.id == permission.id_] - gp = None if len(gp) == 0 else gp[0] - if permission.enabled and gp is None: - role.permissions.append(db.query(Permission).filter(Permission.id == permission.id_).one()) - elif not permission.enabled and gp: - role.permissions.remove(gp) - - -@router.delete("/{id_}") +@router.delete("/{id_}", response_model=schemas.RoleBlank) def delete( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): +) -> schemas.RoleBlank: try: item: Role = db.query(Role).filter(Role.id == id_).first() if item is None: @@ -96,35 +86,34 @@ def delete( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Role not found", ) - else: - raise HTTPException( - status_code=status.HTTP_501_NOT_IMPLEMENTED, - detail="Role deletion not implemented", - ) + raise HTTPException( + status_code=status.HTTP_501_NOT_IMPLEMENTED, + detail="Role deletion not implemented", + ) except Exception: db.rollback() raise -@router.get("") +@router.get("", response_model=schemas.RoleBlank) def show_blank( db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): - return role_info(None, db) +) -> schemas.RoleBlank: + return role_blank(db) @router.get("/list", response_model=List[schemas.RoleList]) -async def show_list( +def show_list( db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): +) -> List[schemas.RoleList]: return [ - { - "id": item.id, - "name": item.name, - "permissions": [p.name for p in sorted(item.permissions, key=lambda p: p.name)], - } + schemas.RoleList( + id=item.id, + name=item.name, + permissions=[p.name for p in sorted(item.permissions, key=lambda p: p.name)], + ) for item in db.query(Role).order_by(Role.name).all() ] @@ -134,30 +123,41 @@ def show_id( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["users"]), -): +) -> schemas.Role: item: Role = db.query(Role).filter(Role.id == id_).first() return role_info(item, db) -def role_info(item: Optional[Role], db): - if item is None: - return { - "name": "", - "permissions": [ - {"id": p.id, "name": p.name, "enabled": False} - for p in db.query(Permission).order_by(Permission.name).all() - ], - } - else: - return { - "id": item.id, - "name": item.name, - "permissions": [ - { - "id": p.id, - "name": p.name, - "enabled": True if p in item.permissions else False, - } - for p in db.query(Permission).order_by(Permission.name).all() - ], - } +def role_info(item: Role, db: Session) -> schemas.Role: + return schemas.Role( + id=item.id, + name=item.name, + permissions=[ + schemas.PermissionItem( + id=p.id, + name=p.name, + enabled=True if p in item.permissions else False, + ) + for p in db.query(Permission).order_by(Permission.name).all() + ], + ) + + +def role_blank(db: Session) -> schemas.RoleBlank: + return schemas.RoleBlank( + name="", + permissions=[ + schemas.PermissionItem(id=p.id, name=p.name, enabled=False) + for p in db.query(Permission).order_by(Permission.name).all() + ], + ) + + +def add_permissions(role: Role, permissions: List[schemas.PermissionItem], db: Session): + for permission in permissions: + gp = [p for p in role.permissions if p.id == permission.id_] + gp = None if len(gp) == 0 else gp[0] + if permission.enabled and gp is None: + role.permissions.append(db.query(Permission).filter(Permission.id == permission.id_).one()) + elif not permission.enabled and gp: + role.permissions.remove(gp) diff --git a/barker/barker/routers/sale_category.py b/barker/barker/routers/sale_category.py index 4f56c88..a618287 100644 --- a/barker/barker/routers/sale_category.py +++ b/barker/barker/routers/sale_category.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import SaleCategory -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/section.py b/barker/barker/routers/section.py index 71624ba..d10501e 100644 --- a/barker/barker/routers/section.py +++ b/barker/barker/routers/section.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import Section -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/section_printer.py b/barker/barker/routers/section_printer.py index 7a3ef7d..35555d4 100644 --- a/barker/barker/routers/section_printer.py +++ b/barker/barker/routers/section_printer.py @@ -13,7 +13,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import MenuCategory, SectionPrinter -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() @@ -34,16 +34,16 @@ def save( data: List[schemas.SectionPrinter], db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), -): +) -> List[schemas.SectionPrinter]: try: current = [] default_copies = 0 for mcs in data: - if mcs.menu_category.id_ is None and mcs.printer.id_ is None: + if mcs.menu_category is None and mcs.printer is None: raise ValueError("Please choose a default printer") - if mcs.printer.id_ is None: + if mcs.printer is None: continue - if mcs.menu_category.id_ is None: + if mcs.menu_category is None: default_copies = mcs.copies stmt = ( pg_insert(SectionPrinter.__table__) @@ -60,7 +60,7 @@ def save( ) ) db.execute(stmt) - current.append(mcs.menu_category.id_) + current.append(None if mcs.menu_category is None else mcs.menu_category.id_) db.execute( SectionPrinter.__table__.delete( or_( @@ -91,12 +91,12 @@ def save( raise -@router.delete("/{id_}") +@router.delete("/{id_}", response_model=List[schemas.SectionPrinter]) def delete( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), -): +) -> List[schemas.SectionPrinter]: try: SectionPrinter.__table__.delete(SectionPrinter.section_id == id_) db.commit() @@ -112,44 +112,24 @@ def delete( raise -@router.get("") +@router.get("", response_model=List[schemas.SectionPrinter]) def show_blank( db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), -): +) -> List[schemas.SectionPrinter]: return report(None, db) -@router.get("/{id_}") +@router.get("/{id_}", response_model=List[schemas.SectionPrinter]) def show_id( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), -): +) -> List[schemas.SectionPrinter]: return report(id_, db) -# @view_config( -# request_method="GET", -# route_name="v1_section_printers_id", -# renderer="json", -# request_param="m", -# permission="Authenticated", -# ) -# def show_details(request): -# section_id = uuid.UUID(request.matchdict["section_id"]) -# menu_category_id = request.GET.get("m", None) -# if menu_category_id is not None: -# menu_category_id = uuid.UUID(menu_category_id) -# item = ( -# request.dbsession.query(SectionPrinter) -# .filter(SectionPrinter.section_id == section_id, SectionPrinter.menu_category_id == menu_category_id,) -# .first() -# ) -# return section_printer_info(item, request.dbsession) - - -def report(section_id: uuid.UUID, db: Session): +def report(section_id: Optional[uuid.UUID], db: Session) -> List[schemas.SectionPrinter]: menu_categories = ( db.query(MenuCategory.id, MenuCategory.name) .filter(MenuCategory.is_active == True) # noqa: E712 @@ -157,36 +137,20 @@ def report(section_id: uuid.UUID, db: Session): .all() ) list_ = [] - for item in [(None,)] + menu_categories: - mc = ( + for mc_id, mc_name in [(None, None)] + menu_categories: + section_printer = ( db.query(SectionPrinter) .filter( SectionPrinter.section_id == section_id, - SectionPrinter.menu_category_id == item[0], + SectionPrinter.menu_category_id == mc_id, ) .first() ) list_.append( - { - "menuCategory": {} if item[0] is None else {"id": item[0], "name": item[1]}, - "printer": {} if mc is None else {"id": mc.printer_id}, - "copies": 0 if mc is None else mc.copies, - } + schemas.SectionPrinter( + menuCategory=None if mc_id is None else schemas.MenuCategoryLink(id=mc_id, name=mc_name), + printer=None if section_printer is None else schemas.PrinterLink(id=section_printer.printer_id), + copies=0 if section_printer is None else section_printer.copies, + ) ) return list_ - - -def section_printer_info(item: Optional[SectionPrinter]): - if item is None: - return {"menuCategory": {}, "section": {}, "printer": {}, "copies": 0} - # if type(item) is uuid.UUID: - # item = db.query(SectionPrinter).filter(SectionPrinter.id == item).first() - return { - "id": item.id, - "menuCategory": None - if item.menu_category is None - else {"id": item.menu_category.id, "name": item.menu_category.name}, - "section": {"id": item.section.id, "name": item.section.name}, - "printer": {"id": item.printer.id, "name": item.printer.name}, - "copies": item.copies, - } diff --git a/barker/barker/routers/setting.py b/barker/barker/routers/setting.py index 07f5e95..9e89825 100644 --- a/barker/barker/routers/setting.py +++ b/barker/barker/routers/setting.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import DbSetting -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/settle_option.py b/barker/barker/routers/settle_option.py index 0d27bd3..85c8f64 100644 --- a/barker/barker/routers/settle_option.py +++ b/barker/barker/routers/settle_option.py @@ -3,13 +3,14 @@ from typing import List import barker.schemas.settle_option as schemas from fastapi import APIRouter, Depends, HTTPException, Security, status +from sqlalchemy import func from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import ReportingLevel, SettleOption, VoucherType -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() @@ -32,7 +33,7 @@ def save( ) -> schemas.SettleOption: try: item = SettleOption( - id_=data.id_, + id_=db.query(func.max(SettleOption.id) + 1).scalar(), name=data.name, voucher_type=data.voucher_type, reporting_level=data.reporting_level, diff --git a/barker/barker/routers/table.py b/barker/barker/routers/table.py index 71748bd..52c6ac0 100644 --- a/barker/barker/routers/table.py +++ b/barker/barker/routers/table.py @@ -12,7 +12,7 @@ from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import FoodTable from ..models.voucher import Overview -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/tax.py b/barker/barker/routers/tax.py index f333ae7..3ba4e4a 100644 --- a/barker/barker/routers/tax.py +++ b/barker/barker/routers/tax.py @@ -15,7 +15,7 @@ from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import SaleCategory, Tax from ..models.voucher import Inventory -from ..schemas.auth import UserToken +from ..schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/update_product_prices.py b/barker/barker/routers/update_product_prices.py index 8a109a2..3e95e15 100644 --- a/barker/barker/routers/update_product_prices.py +++ b/barker/barker/routers/update_product_prices.py @@ -11,8 +11,8 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import MenuCategory, ProductVersion -from ..schemas.auth import UserToken from ..schemas.update_product_prices import UpdateProductPrices, UpdateProductPricesItem +from ..schemas.user_token import UserToken from . import optional_query_date diff --git a/barker/barker/routers/auth/user.py b/barker/barker/routers/user.py similarity index 96% rename from barker/barker/routers/auth/user.py rename to barker/barker/routers/user.py index 2184d73..41c66e0 100644 --- a/barker/barker/routers/auth/user.py +++ b/barker/barker/routers/user.py @@ -2,17 +2,16 @@ import uuid from typing import List -import barker.schemas.auth as schemas +import barker.schemas.user as schemas +from barker.core.security import get_current_active_user as get_user +from barker.db.session import SessionLocal +from barker.models.auth import Role, User +from barker.schemas.user_token import UserToken from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session -from ...core.security import get_current_active_user as get_user -from ...db.session import SessionLocal -from ...models.auth import Role, User -from ...schemas.auth import UserToken - router = APIRouter() diff --git a/barker/barker/routers/voucher/change.py b/barker/barker/routers/voucher/change.py index ec938f2..7187574 100644 --- a/barker/barker/routers/voucher/change.py +++ b/barker/barker/routers/voucher/change.py @@ -13,8 +13,8 @@ from ...db.session import SessionLocal from ...models.master import SettleOption, VoucherType from ...models.voucher import Overview, Reprint, Voucher from ...routers.voucher import do_update_settlements, get_guest_book -from ...schemas.auth import UserToken from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema +from ...schemas.user_token import UserToken from .save import do_save diff --git a/barker/barker/routers/voucher/merge_move.py b/barker/barker/routers/voucher/merge_move.py index 0ffc4e7..c0d144a 100644 --- a/barker/barker/routers/voucher/merge_move.py +++ b/barker/barker/routers/voucher/merge_move.py @@ -15,7 +15,7 @@ from ...db.session import SessionLocal from ...models.master import VoucherType from ...models.voucher import Kot, Overview, Settlement, Voucher from ...routers.voucher import do_update_settlements, do_update_table, get_bill_id -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/voucher/receive_payment.py b/barker/barker/routers/voucher/receive_payment.py index a7e7705..0b69f5a 100644 --- a/barker/barker/routers/voucher/receive_payment.py +++ b/barker/barker/routers/voucher/receive_payment.py @@ -10,7 +10,7 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import SettleOption, VoucherType from ...models.voucher import Overview, Voucher -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken from . import do_update_settlements diff --git a/barker/barker/routers/voucher/save.py b/barker/barker/routers/voucher/save.py index 35b9e20..5de9f79 100644 --- a/barker/barker/routers/voucher/save.py +++ b/barker/barker/routers/voucher/save.py @@ -27,7 +27,7 @@ from ...routers.voucher import ( happy_hour_has_discount, happy_hour_items_balanced, ) -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/voucher/show.py b/barker/barker/routers/voucher/show.py index a4dd8e1..ec78825 100644 --- a/barker/barker/routers/voucher/show.py +++ b/barker/barker/routers/voucher/show.py @@ -12,7 +12,7 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import FoodTable, ProductVersion, VoucherType from ...models.voucher import GuestBook, Overview, Voucher -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/voucher/split.py b/barker/barker/routers/voucher/split.py index cb14d9f..3104576 100644 --- a/barker/barker/routers/voucher/split.py +++ b/barker/barker/routers/voucher/split.py @@ -22,8 +22,8 @@ from ...routers.voucher import ( do_update_table, get_bill_id, ) -from ...schemas.auth import UserToken from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema +from ...schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/voucher/update.py b/barker/barker/routers/voucher/update.py index f422f97..bcdab88 100644 --- a/barker/barker/routers/voucher/update.py +++ b/barker/barker/routers/voucher/update.py @@ -28,7 +28,7 @@ from ...routers.voucher import ( happy_hour_items_balanced, happy_hour_items_more_than_regular, ) -from ...schemas.auth import UserToken +from ...schemas.user_token import UserToken router = APIRouter() diff --git a/barker/barker/routers/voucher/void.py b/barker/barker/routers/voucher/void.py index 9b428d6..67c7214 100644 --- a/barker/barker/routers/voucher/void.py +++ b/barker/barker/routers/voucher/void.py @@ -8,8 +8,8 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from ...models.master import SettleOption, VoucherType from ...models.voucher import Overview, Voucher -from ...schemas.auth import UserToken from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema +from ...schemas.user_token import UserToken from . import do_update_settlements diff --git a/barker/barker/schemas/auth.py b/barker/barker/schemas/auth.py deleted file mode 100644 index 4a34db8..0000000 --- a/barker/barker/schemas/auth.py +++ /dev/null @@ -1,118 +0,0 @@ -import uuid - -from datetime import datetime -from typing import List, Optional - -from pydantic import BaseModel - -from . import to_camel - - -class ClientIn(BaseModel): - name: str - enabled: bool - otp: Optional[int] - - -class Client(ClientIn): - id_: uuid.UUID - code: int - creation_date: datetime - - -class LoginHistory(BaseModel): - id_: uuid.UUID - user_id: uuid.UUID - client_id: uuid.UUID - date: datetime - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class PermissionItem(BaseModel): - id_: uuid.UUID - name: str - enabled: bool - - class Config: - fields = {"id_": "id"} - - -class RoleIn(BaseModel): - name: str - permissions: List[PermissionItem] - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - - -class Role(RoleIn): - id_: uuid.UUID - - -class RoleList(BaseModel): - id_: uuid.UUID - name: str - permissions: List[str] - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - - -class RoleItem(BaseModel): - id_: uuid.UUID - name: str - enabled: bool - - class Config: - fields = {"id_": "id"} - - -class UserIn(BaseModel): - name: str - password: str - locked_out: bool - roles: List[RoleItem] - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class User(UserIn): - id_: uuid.UUID - - -class UserLink(BaseModel): - id_: Optional[uuid.UUID] - name: Optional[str] - - class Config: - alias_generator = to_camel - - -class UserList(BaseModel): - id_: uuid.UUID - name: str - roles: List[str] - last_device: str - last_date: Optional[datetime] - - class Config: - anystr_strip_whitespace = True - alias_generator = to_camel - json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M")} - - -class UserToken(BaseModel): - id_: uuid.UUID - name: str - locked_out: bool = None - password: str - permissions: List[str] diff --git a/barker/barker/schemas/cashier_report.py b/barker/barker/schemas/cashier_report.py index a7e2ae8..317582d 100644 --- a/barker/barker/schemas/cashier_report.py +++ b/barker/barker/schemas/cashier_report.py @@ -5,7 +5,7 @@ from typing import Dict, List from pydantic import BaseModel, validator from . import to_camel -from .auth import UserLink +from .user import UserLink class NameAmount(BaseModel): diff --git a/barker/barker/schemas/login_history.py b/barker/barker/schemas/login_history.py new file mode 100644 index 0000000..b985576 --- /dev/null +++ b/barker/barker/schemas/login_history.py @@ -0,0 +1,17 @@ +import uuid + +from datetime import datetime + +from barker.schemas import to_camel +from pydantic import BaseModel + + +class LoginHistory(BaseModel): + id_: uuid.UUID + user_id: uuid.UUID + client_id: uuid.UUID + date: datetime + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel diff --git a/barker/barker/schemas/permission.py b/barker/barker/schemas/permission.py new file mode 100644 index 0000000..cb0310d --- /dev/null +++ b/barker/barker/schemas/permission.py @@ -0,0 +1,12 @@ +import uuid + +from pydantic import BaseModel + + +class PermissionItem(BaseModel): + id_: uuid.UUID + name: str + enabled: bool + + class Config: + fields = {"id_": "id"} diff --git a/barker/barker/schemas/role.py b/barker/barker/schemas/role.py new file mode 100644 index 0000000..87d1fef --- /dev/null +++ b/barker/barker/schemas/role.py @@ -0,0 +1,48 @@ +import uuid + +from typing import List + +from barker.schemas.permission import PermissionItem +from pydantic import BaseModel, Field + + +class RoleIn(BaseModel): + name: str = Field(..., min_length=1) + permissions: List[PermissionItem] + + class Config: + anystr_strip_whitespace = True + + +class Role(RoleIn): + id_: uuid.UUID + + class Config: + anystr_strip_whitespace = True + fields = {"id_": "id"} + + +class RoleBlank(RoleIn): + name: str + + class Config: + anystr_strip_whitespace = True + + +class RoleList(BaseModel): + id_: uuid.UUID + name: str + permissions: List[str] + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + + +class RoleItem(BaseModel): + id_: uuid.UUID + name: str + enabled: bool + + class Config: + fields = {"id_": "id"} diff --git a/barker/barker/schemas/sale_report.py b/barker/barker/schemas/sale_report.py index 0602328..21d4c7f 100644 --- a/barker/barker/schemas/sale_report.py +++ b/barker/barker/schemas/sale_report.py @@ -5,7 +5,7 @@ from typing import List from pydantic import BaseModel, validator from . import to_camel -from .auth import UserLink +from .user import UserLink class SaleReportItem(BaseModel): diff --git a/barker/barker/schemas/section_printer.py b/barker/barker/schemas/section_printer.py index 7d53465..1e27181 100644 --- a/barker/barker/schemas/section_printer.py +++ b/barker/barker/schemas/section_printer.py @@ -1,30 +1,15 @@ -import uuid - from typing import Optional from pydantic import BaseModel, Field from . import to_camel - - -class MenuCategoryLink(BaseModel): - id_: Optional[uuid.UUID] - name: Optional[str] - - class Config: - fields = {"id_": "id"} - - -class PrinterLink(BaseModel): - id_: Optional[uuid.UUID] - - class Config: - fields = {"id_": "id"} +from .menu_category import MenuCategoryLink +from .printer import PrinterLink class SectionPrinter(BaseModel): - menu_category: MenuCategoryLink - printer: PrinterLink + menu_category: Optional[MenuCategoryLink] + printer: Optional[PrinterLink] copies: int = Field(ge=0) class Config: diff --git a/barker/barker/schemas/table.py b/barker/barker/schemas/table.py index 77a5cc7..eeaabea 100644 --- a/barker/barker/schemas/table.py +++ b/barker/barker/schemas/table.py @@ -28,7 +28,7 @@ class Table(TableIn): class TableBlank(TableIn): - name: str = Field(..., min_length=1) + name: str section: Optional[SectionLink] class Config: diff --git a/barker/barker/schemas/user.py b/barker/barker/schemas/user.py new file mode 100644 index 0000000..f39036d --- /dev/null +++ b/barker/barker/schemas/user.py @@ -0,0 +1,48 @@ +import uuid + +from datetime import datetime +from typing import List, Optional + +from barker.schemas import to_camel +from barker.schemas.role import RoleItem +from pydantic import BaseModel + + +class UserIn(BaseModel): + name: str + password: str + locked_out: bool + roles: List[RoleItem] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + + +class User(UserIn): + id_: uuid.UUID + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + + +class UserLink(BaseModel): + id_: Optional[uuid.UUID] + name: Optional[str] + + class Config: + fields = {"id_": "id"} + + +class UserList(BaseModel): + id_: uuid.UUID + name: str + roles: List[str] + last_device: str + last_date: Optional[datetime] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M")} diff --git a/barker/barker/schemas/user_token.py b/barker/barker/schemas/user_token.py new file mode 100644 index 0000000..420f7b2 --- /dev/null +++ b/barker/barker/schemas/user_token.py @@ -0,0 +1,13 @@ +import uuid + +from typing import List + +from pydantic import BaseModel + + +class UserToken(BaseModel): + id_: uuid.UUID + name: str + locked_out: bool = None + password: str + permissions: List[str] diff --git a/bookie/src/app/core/section-printer.ts b/bookie/src/app/core/section-printer.ts index 850c0f7..7808be4 100644 --- a/bookie/src/app/core/section-printer.ts +++ b/bookie/src/app/core/section-printer.ts @@ -2,13 +2,13 @@ import { MenuCategory } from './menu-category'; import { Printer } from './printer'; export class SectionPrinter { - menuCategory: MenuCategory; - printer: Printer; + menuCategory: MenuCategory | null; + printer: Printer | null; copies: number; public constructor(init?: Partial) { - this.menuCategory = new MenuCategory(); - this.printer = new Printer(); + this.menuCategory = null; + this.printer = null; this.copies = 0; Object.assign(this, init); } diff --git a/bookie/src/app/core/table.ts b/bookie/src/app/core/table.ts index da252f2..e730b6a 100644 --- a/bookie/src/app/core/table.ts +++ b/bookie/src/app/core/table.ts @@ -4,7 +4,7 @@ export class Table { id: string | undefined; name: string; seats: number; - section: Section; + section?: Section; isActive: boolean; voucherId?: string; status?: string; diff --git a/bookie/src/app/section-printers/section-printer.component.ts b/bookie/src/app/section-printers/section-printer.component.ts index 2364073..e4646f4 100644 --- a/bookie/src/app/section-printers/section-printer.component.ts +++ b/bookie/src/app/section-printers/section-printer.component.ts @@ -122,7 +122,11 @@ export class SectionPrinterComponent implements OnInit { const array = this.form.get('menuCategories') as FormArray; this.list.forEach((item, index) => { const cont = array.controls[index].value; - item.printer = { id: cont.printer }; + if (cont.printer === null || cont.printer === undefined) { + item.printer = null; + } else { + item.printer = { id: cont.printer }; + } item.copies = +cont.copies; }); return this.list; diff --git a/bookie/src/app/tables/table-detail/table-detail.component.ts b/bookie/src/app/tables/table-detail/table-detail.component.ts index cbbf8aa..8cb4107 100644 --- a/bookie/src/app/tables/table-detail/table-detail.component.ts +++ b/bookie/src/app/tables/table-detail/table-detail.component.ts @@ -50,7 +50,7 @@ export class TableDetailComponent implements OnInit, AfterViewInit { this.form.setValue({ name: this.item.name, seats: this.item.seats, - section: this.item.section.id ? this.item.section.id : '', + section: this.item.section ? this.item.section.id : '', isActive: this.item.isActive, }); } @@ -104,6 +104,9 @@ export class TableDetailComponent implements OnInit, AfterViewInit { const formModel = this.form.value; this.item.name = formModel.name; this.item.seats = +formModel.seats; + if (this.item.section === null || this.item.section === undefined) { + this.item.section = new Section(); + } this.item.section.id = formModel.section; this.item.isActive = formModel.isActive; return this.item;