Add beamtime assignment functionality for dewars and pucks
Implemented API endpoints and frontend logic to assign/unassign beamtime to dewars and pucks. Enhanced schemas, models, and styles while refactoring related frontend components for better user experience and data handling.
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
import os
|
||||
import tempfile
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
import random
|
||||
import hashlib
|
||||
from fastapi import APIRouter, HTTPException, status, Depends, Response
|
||||
@ -21,7 +22,10 @@ from app.schemas import (
|
||||
Sample,
|
||||
Puck,
|
||||
SampleEventResponse,
|
||||
DewarSchema, # Clearer name for schema
|
||||
DewarSchema,
|
||||
loginData,
|
||||
DewarWithPucksResponse,
|
||||
PuckResponse,
|
||||
)
|
||||
from app.models import (
|
||||
Dewar as DewarModel,
|
||||
@ -44,6 +48,7 @@ from reportlab.pdfgen import canvas
|
||||
from app.crud import (
|
||||
get_shipment_by_id,
|
||||
)
|
||||
from app.routers.auth import get_current_user
|
||||
|
||||
|
||||
dewar_router = APIRouter()
|
||||
@ -543,6 +548,64 @@ def get_all_serial_numbers(db: Session = Depends(get_db)):
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@dewar_router.get(
|
||||
"/recent-dewars-with-pucks",
|
||||
response_model=List[DewarWithPucksResponse],
|
||||
operation_id="getRecentDewarsWithPucks",
|
||||
)
|
||||
async def get_recent_dewars_with_pucks(
|
||||
db: Session = Depends(get_db), current_user: loginData = Depends(get_current_user)
|
||||
):
|
||||
# Get the timestamp for two months ago
|
||||
two_months_ago = datetime.now() - timedelta(days=60)
|
||||
|
||||
# Query dewars for this user created in the last 2 months
|
||||
dewars = (
|
||||
db.query(DewarModel)
|
||||
.options(joinedload(DewarModel.pucks)) # Eager load pucks
|
||||
.filter(
|
||||
DewarModel.pgroups.in_(current_user.pgroups),
|
||||
DewarModel.created_at >= two_months_ago,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
|
||||
result = []
|
||||
for dewar in dewars:
|
||||
pucks = db.query(PuckModel).filter(PuckModel.dewar_id == dewar.id).all()
|
||||
result.append(
|
||||
DewarWithPucksResponse(
|
||||
id=dewar.id,
|
||||
dewar_name=dewar.dewar_name,
|
||||
created_at=dewar.created_at,
|
||||
pucks=[
|
||||
PuckResponse(id=puck.id, puck_name=puck.puck_name) for puck in pucks
|
||||
],
|
||||
)
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
@dewar_router.patch(
|
||||
"/dewar/{dewar_id}/assign-beamtime", operation_id="assignDewarToBeamtime"
|
||||
)
|
||||
async def assign_beamtime_to_dewar(
|
||||
dewar_id: int,
|
||||
beamtime_id: int, # Use Query if you want this from ?beamtime_id=...
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
||||
if not dewar: # <- Move check earlier!
|
||||
raise HTTPException(status_code=404, detail="Dewar not found")
|
||||
if beamtime_id == 0:
|
||||
dewar.beamtime_id = None
|
||||
else:
|
||||
dewar.beamtime_id = beamtime_id
|
||||
db.commit()
|
||||
db.refresh(dewar)
|
||||
return {"status": "success", "dewar_id": dewar.id, "beamtime_id": beamtime_id}
|
||||
|
||||
|
||||
@dewar_router.get("/{dewar_id}", response_model=Dewar)
|
||||
async def get_dewar(dewar_id: int, db: Session = Depends(get_db)):
|
||||
dewar = (
|
||||
|
Reference in New Issue
Block a user