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 from app.models import Dewar as DewarModel, Puck as PuckModel 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: int, 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: int, 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 @router.delete("/{dewar_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_dewar(dewar_id: int, db: Session = Depends(get_db)): dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first() if not dewar: raise HTTPException(status_code=404, detail="Dewar not found") db.delete(dewar) db.commit() return