barker/barker/barker/routers/table.py

201 lines
6.2 KiB
Python

import uuid
from typing import Optional, List
from fastapi import APIRouter, HTTPException, status, Depends, Security
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from ..models import Overview
from ..schemas.auth import UserToken
import barker.schemas.master as schemas
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import FoodTable
router = APIRouter()
# Dependency
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.post("/list", response_model=List[schemas.Table])
def sort_order(
data: List[schemas.Table], db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["tables"]),
):
try:
for index, item in enumerate(data):
db.query(FoodTable).filter(FoodTable.id == item.id_).update(
{FoodTable.sort_order: index}
)
db.commit()
return [
{
"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,
}
for item in db.query(FoodTable).order_by(FoodTable.sort_order).all()
]
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.post("", response_model=schemas.Table)
def save(
data: schemas.TableIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]),
):
try:
item = FoodTable(name=data.name, seats=data.seats, section_id=data.section.id_, is_active=data.is_active)
db.add(item)
db.commit()
return food_table_info(item)
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.Table)
def update(
id_: uuid.UUID,
data: schemas.TableIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["tables"]),
):
try:
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
item.name = data.name
item.seats = data.seats
item.section_id = data.section.id_
item.is_active = data.is_active
db.commit()
return food_table_info(item)
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.delete("/{id_}")
def delete(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]),
):
try:
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
db.delete(item)
db.commit()
return food_table_info(item)
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.get("")
def show_blank(
db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]),
):
return food_table_info(None)
@router.get("/list")
def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
return [
{
"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,
}
for item in db.query(FoodTable).order_by(FoodTable.sort_order).all()
]
@router.get("/running")
def show_running(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
list_ = db.query(FoodTable).filter(FoodTable.is_active == True).order_by(FoodTable.sort_order).all()
food_tables = []
for item in list_:
ft = {
"id": item.id,
"name": item.name,
"seats": item.seats,
"section": {"id": item.section_id, "name": item.section.name},
"isActive": item.is_active,
"sortOrder": item.sort_order,
}
if item.status is not None:
ft["status"] = item.status.status
ft["voucherId"] = item.status.voucher_id
ft["pax"] = item.status.voucher.pax
ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M")
ft["amount"] = item.status.voucher.amount
if item.status.guest is not None:
ft["guest"] = item.status.guest.customer.name
food_tables.append(ft)
return food_tables
@router.get("/from-voucher/{id_}")
def show_voucher(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user),
):
overview: Overview = db.query(Overview).filter(Overview.voucher_id == id_).first()
if overview is not None:
return food_table_info(overview.food_table)
return food_table_info(None)
@router.get("/{id_}")
def show_id(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]),
):
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
return food_table_info(item)
def food_table_info(item: Optional[FoodTable]):
if item is None:
return {"name": "", "seats": 0, "section": {}, "isActive": True, "sortOrder": 0}
return {
"id": item.id,
"name": item.name,
"seats": item.seats,
"section": {"id": item.section_id, "name": item.section.name},
"isActive": item.is_active,
"status": "" if item.status is None else item.status.status,
"sortOrder": item.sort_order,
"voucherId": None if item.status is None else item.status.voucher_id,
}