73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
from fastapi import APIRouter, HTTPException, status, Depends
|
|
from sqlalchemy.orm import Session, joinedload
|
|
from typing import List
|
|
import uuid
|
|
from app.schemas import Dewar as DewarSchema, DewarCreate, DewarUpdate, Sample as SampleSchema, Puck as PuckSchema
|
|
from app.models import Dewar as DewarModel, Puck as PuckModel, Sample as SampleModel
|
|
from app.dependencies import get_db
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", response_model=List[DewarSchema])
|
|
async def get_dewars(db: Session = Depends(get_db)):
|
|
dewars = db.query(DewarModel).options(joinedload(DewarModel.pucks)).all()
|
|
return dewars
|
|
|
|
|
|
@router.post("/", response_model=DewarSchema, status_code=status.HTTP_201_CREATED)
|
|
async def create_dewar(dewar: DewarCreate, db: Session = Depends(get_db)) -> DewarSchema:
|
|
db_dewar = DewarModel(
|
|
dewar_name=dewar.dewar_name,
|
|
tracking_number=dewar.tracking_number,
|
|
status=dewar.status,
|
|
ready_date=dewar.ready_date,
|
|
shipping_date=dewar.shipping_date,
|
|
arrival_date=dewar.arrival_date,
|
|
returning_date=dewar.returning_date,
|
|
qrcode=dewar.qrcode,
|
|
contact_person_id=dewar.contact_person_id,
|
|
return_address_id=dewar.return_address_id
|
|
)
|
|
|
|
db.add(db_dewar)
|
|
db.commit()
|
|
db.refresh(db_dewar)
|
|
|
|
return db_dewar
|
|
|
|
|
|
@router.get("/{dewar_id}", response_model=DewarSchema)
|
|
async def get_dewar(dewar_id: str, db: Session = Depends(get_db)):
|
|
dewar = db.query(DewarModel).options(
|
|
joinedload(DewarModel.pucks).joinedload(PuckModel.positions)
|
|
).filter(DewarModel.id == dewar_id).first()
|
|
|
|
if not dewar:
|
|
raise HTTPException(status_code=404, detail="Dewar not found")
|
|
|
|
# Ensure dewar.pucks is an empty list if there are no pucks
|
|
dewar_dict = dewar.__dict__
|
|
if dewar_dict.get("pucks") is None:
|
|
dewar_dict["pucks"] = []
|
|
|
|
return DewarSchema.from_orm(dewar)
|
|
|
|
|
|
@router.put("/{dewar_id}", response_model=DewarSchema)
|
|
async def update_dewar(dewar_id: str, dewar_update: DewarUpdate, db: Session = Depends(get_db)) -> DewarSchema:
|
|
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
|
|
|
if not dewar:
|
|
raise HTTPException(status_code=404, detail="Dewar not found")
|
|
|
|
for key, value in dewar_update.dict(exclude_unset=True).items():
|
|
# Ensure we're only setting directly settable attributes
|
|
if hasattr(dewar, key):
|
|
setattr(dewar, key, value)
|
|
|
|
db.commit()
|
|
db.refresh(dewar)
|
|
|
|
return dewar
|