brewman/brewman/routers/cost_centre.py

132 lines
3.8 KiB
Python
Raw Normal View History

import uuid
from typing import List, Optional
2020-05-10 10:35:39 +00:00
from fastapi import APIRouter, HTTPException, status, Depends, Security
2020-05-08 10:48:50 +00:00
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from ..schemas.auth import UserToken
2020-05-08 10:48:50 +00:00
import brewman.schemas.master as schemas
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import CostCentre
router = APIRouter()
# Dependency
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.post("", response_model=schemas.CostCentre)
def save(
data: schemas.CostCentreIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["cost-centres"]),
):
try:
2020-05-10 10:35:39 +00:00
item = CostCentre(name=data.name)
db.add(item)
db.commit()
return cost_centre_info(item)
2020-05-10 10:35:39 +00:00
except SQLAlchemyError as e:
db.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e),
2020-05-10 10:35:39 +00:00
)
except Exception:
db.rollback()
raise
@router.put("/{id_}", response_model=schemas.CostCentre)
def update(
id_: uuid.UUID,
data: schemas.CostCentreIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["cost-centres"]),
):
try:
item = db.query(CostCentre).filter(CostCentre.id == id_).first()
if item.is_fixture:
raise HTTPException(
2020-05-31 09:11:11 +00:00
status_code=status.HTTP_423_LOCKED, detail=f"{item.name} is a fixture and cannot be edited or deleted.",
)
item.name = data.name
db.commit()
return cost_centre_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(
2020-05-31 09:11:11 +00:00
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]),
):
try:
item: CostCentre = db.query(CostCentre).filter(CostCentre.id == id_).first()
if item is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Cost Centre not found",
)
elif item.is_fixture:
raise HTTPException(
2020-05-31 09:11:11 +00:00
status_code=status.HTTP_423_LOCKED, detail=f"{item.name} is a fixture and cannot be edited or deleted.",
)
else:
raise HTTPException(
2020-05-31 09:11:11 +00:00
status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="Cost Centre deletion not implemented",
)
except Exception:
db.rollback()
raise
@router.get("")
def show_blank(
2020-05-31 09:11:11 +00:00
db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]),
):
return cost_centre_info(None)
@router.get("/list", response_model=List[schemas.CostCentre])
async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
return [
{"id": item.id, "name": item.name, "isFixture": item.is_fixture}
for item in db.query(CostCentre).order_by(CostCentre.name).all()
]
@router.get("/{id_}", response_model=schemas.CostCentre)
def show_id(
2020-05-31 09:11:11 +00:00
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]),
):
item = db.query(CostCentre).filter(CostCentre.id == id_).first()
return cost_centre_info(item)
def cost_centre_info(item: Optional[CostCentre]):
if item is None:
return {
"name": "",
"isFixture": False,
}
else:
return {
"id": item.id,
"name": item.name,
"isFixture": item.is_fixture,
}