Add beamtime functionality to backend.
Introduce new endpoint and model for managing beamtimes, including shifts and user-specific access. Updated test scripts and data to reflect beamtime integration, along with minor fixes for job status enumeration and example notebook refinement.
This commit is contained in:
72
backend/app/routers/beamtime.py
Normal file
72
backend/app/routers/beamtime.py
Normal file
@ -0,0 +1,72 @@
|
||||
from fastapi import APIRouter, HTTPException, status, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import or_
|
||||
|
||||
from app.models import Beamtime as BeamtimeModel
|
||||
from app.schemas import Beamtime as BeamtimeSchema, BeamtimeCreate, loginData
|
||||
from app.dependencies import get_db
|
||||
from app.routers.auth import get_current_user
|
||||
|
||||
beamtime_router = APIRouter()
|
||||
|
||||
|
||||
@beamtime_router.post("/", response_model=BeamtimeSchema)
|
||||
async def create_beamtime(
|
||||
beamtime: BeamtimeCreate,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: loginData = Depends(get_current_user),
|
||||
):
|
||||
# Validate the pgroup belongs to the current user
|
||||
if beamtime.pgroups not in current_user.pgroups:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="You do not have permission to create a beamtime for this pgroup.",
|
||||
)
|
||||
|
||||
# Check for existing beamtime for this pgroup, date, and shift
|
||||
existing = (
|
||||
db.query(BeamtimeModel)
|
||||
.filter(
|
||||
BeamtimeModel.pgroups == beamtime.pgroups,
|
||||
BeamtimeModel.start_date == beamtime.start_date,
|
||||
BeamtimeModel.shift == beamtime.shift,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
if existing:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="A beamtime for this pgroup/shift/date already exists.",
|
||||
)
|
||||
|
||||
db_beamtime = BeamtimeModel(
|
||||
pgroups=beamtime.pgroups,
|
||||
shift=beamtime.shift,
|
||||
beamtime_name=beamtime.beamtime_name,
|
||||
beamline=beamtime.beamline,
|
||||
start_date=beamtime.start_date,
|
||||
end_date=beamtime.end_date,
|
||||
status=beamtime.status,
|
||||
comments=beamtime.comments,
|
||||
proposal_id=beamtime.proposal_id,
|
||||
local_contact_id=beamtime.local_contact_id,
|
||||
)
|
||||
|
||||
db.add(db_beamtime)
|
||||
db.commit()
|
||||
db.refresh(db_beamtime)
|
||||
return db_beamtime
|
||||
|
||||
|
||||
@beamtime_router.get(
|
||||
"/my-beamtimes",
|
||||
response_model=list[BeamtimeSchema],
|
||||
)
|
||||
async def get_my_beamtimes(
|
||||
db: Session = Depends(get_db),
|
||||
current_user: loginData = Depends(get_current_user),
|
||||
):
|
||||
user_pgroups = current_user.pgroups
|
||||
filters = [BeamtimeModel.pgroups.like(f"%{pgroup}%") for pgroup in user_pgroups]
|
||||
beamtimes = db.query(BeamtimeModel).filter(or_(*filters)).all()
|
||||
return beamtimes
|
Reference in New Issue
Block a user