barker/barker/barker/routers/guest_book.py

167 lines
5.1 KiB
Python

import uuid
from typing import Optional
from datetime import date, timedelta, datetime
from fastapi import APIRouter, HTTPException, status, Depends, Security
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from ..core.config import settings
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 Customer
from ..models.voucher import GuestBook
router = APIRouter()
# Dependency
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.post("", response_model=schemas.GuestBook)
def save(
data: schemas.GuestBookIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["guest-book"]),
):
try:
customer: Customer = db.query(Customer).filter(Customer.phone == data.phone).first()
if customer is None:
customer = Customer(company=data.company, name=data.name, phone=data.phone, address=data.address,)
db.add(customer)
else:
customer.name = data.name or customer.name
customer.company = data.company or customer.company
customer.address = data.address or customer.address
item = GuestBook(pax=data.pax, customer=customer)
db.add(item)
db.commit()
return guest_book_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.GuestBook)
def update(
id_: uuid.UUID,
data: schemas.GuestBookIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["guest-book"]),
):
try:
item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first()
item.customer.company = data.company
item.customer.name = data.name
item.customer.phone = data.phone
item.customer.address = data.address
item.pax = data.pax
db.commit()
return guest_book_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=["guest-book"]),
):
try:
item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first()
db.delete(item)
db.commit()
return guest_book_info(None)
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=["guest-book"]),
):
return guest_book_info(None)
@router.get("/list")
def show_list(q: Optional[str] = None, db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
if q is None or q == "":
q = date.today()
else:
q = datetime.strptime(q, "%d-%b-%Y")
list_ = (
db.query(GuestBook)
.filter(
GuestBook.date >= q + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES)
)
.filter(
GuestBook.date
< q + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES, days=1)
)
.order_by(GuestBook.date)
.all()
)
guest_book = []
for i, item in enumerate(list_):
guest_book.insert(
0,
{
"id": item.id,
"serial": i + 1,
"company": item.customer.company,
"name": item.customer.name,
"phone": item.customer.phone,
"pax": item.pax,
"date": item.date.strftime("%d-%b-%Y %H:%M"),
"status": "" if item.status is None else item.status.status,
},
)
return {"date": q.strftime("%d-%b-%Y"), "list": guest_book}
@router.get("/{id_}")
def show_id(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["guest-book"]),
):
item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first()
return guest_book_info(item)
def guest_book_info(item: Optional[GuestBook]):
if item is not None:
return {
"id": item.id,
"company": item.customer.company,
"name": item.customer.name,
"phone": item.customer.phone,
"pax": item.pax,
"address": item.customer.address,
"date": item.date.strftime("%d-%b-%Y %H:%M"),
}
else:
return {"company": "", "name": "", "phone": "", "pax": 0, "address": ""}