Refactor Dewar service methods and improve field handling
Updated Dewar API methods to use protected endpoints for enhanced security and consistency. Added `pgroups` handling in various frontend components and modified the LogisticsView contact field for clarity. Simplified backend router imports for better readability.
This commit is contained in:
@ -9,7 +9,6 @@ from typing import List
|
||||
import logging
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from app.schemas import (
|
||||
Dewar as DewarSchema,
|
||||
DewarCreate,
|
||||
DewarUpdate,
|
||||
DewarType as DewarTypeSchema,
|
||||
@ -21,7 +20,8 @@ from app.schemas import (
|
||||
SampleUpdate,
|
||||
Sample,
|
||||
Puck,
|
||||
SampleEventResponse, # Clearer name for schema
|
||||
SampleEventResponse,
|
||||
DewarSchema, # Clearer name for schema
|
||||
)
|
||||
from app.models import (
|
||||
Dewar as DewarModel,
|
||||
@ -42,11 +42,11 @@ from reportlab.lib.pagesizes import A5, landscape
|
||||
from reportlab.lib.units import cm
|
||||
from reportlab.pdfgen import canvas
|
||||
from app.crud import (
|
||||
get_shipments,
|
||||
get_shipment_by_id,
|
||||
) # Import CRUD functions for shipment
|
||||
)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
dewar_router = APIRouter()
|
||||
|
||||
|
||||
def generate_unique_id(db: Session, length: int = 16) -> str:
|
||||
@ -63,12 +63,12 @@ def generate_unique_id(db: Session, length: int = 16) -> str:
|
||||
return unique_id
|
||||
|
||||
|
||||
@router.post("/", response_model=DewarSchema, status_code=status.HTTP_201_CREATED)
|
||||
@dewar_router.post("/", response_model=Dewar, status_code=status.HTTP_201_CREATED)
|
||||
async def create_or_update_dewar(
|
||||
shipment_id: int,
|
||||
dewar: DewarCreate,
|
||||
db: Session = Depends(get_db),
|
||||
) -> DewarSchema:
|
||||
):
|
||||
try:
|
||||
# Query existing dewar by name within the shipment
|
||||
existing_dewar = (
|
||||
@ -170,14 +170,11 @@ async def create_or_update_dewar(
|
||||
|
||||
# Create a completely new dewar if none exists
|
||||
dewar_obj = DewarModel(
|
||||
pgroups=dewar.pgroups,
|
||||
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,
|
||||
contact_person_id=dewar.contact_person_id,
|
||||
contact_id=dewar.contact_id,
|
||||
return_address_id=dewar.return_address_id,
|
||||
shipment_id=shipment_id, # Associate with the shipment
|
||||
)
|
||||
@ -220,7 +217,7 @@ async def create_or_update_dewar(
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.post("/{dewar_id}/generate-qrcode")
|
||||
@dewar_router.post("/{dewar_id}/generate-qrcode")
|
||||
async def generate_dewar_qrcode(dewar_id: int, db: Session = Depends(get_db)):
|
||||
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
||||
if not dewar:
|
||||
@ -365,7 +362,7 @@ def generate_label(dewar):
|
||||
return buffer
|
||||
|
||||
|
||||
@router.get("/{dewar_id}/download-label", response_class=Response)
|
||||
@dewar_router.get("/{dewar_id}/download-label", response_class=Response)
|
||||
async def download_dewar_label(dewar_id: int, db: Session = Depends(get_db)):
|
||||
dewar = (
|
||||
db.query(DewarModel)
|
||||
@ -397,7 +394,7 @@ async def download_dewar_label(dewar_id: int, db: Session = Depends(get_db)):
|
||||
)
|
||||
|
||||
|
||||
@router.put("/samples/{sample_id}", response_model=Sample)
|
||||
@dewar_router.put("/samples/{sample_id}", response_model=Sample)
|
||||
async def update_sample(
|
||||
sample_id: int,
|
||||
sample_update: SampleUpdate,
|
||||
@ -431,7 +428,7 @@ async def update_sample(
|
||||
return Sample.from_orm(sample)
|
||||
|
||||
|
||||
@router.get("/dewars/{dewar_id}/samples", response_model=Dewar)
|
||||
@dewar_router.get("/dewars/{dewar_id}/samples", response_model=Dewar)
|
||||
async def get_dewar_samples(dewar_id: int, db: Session = Depends(get_db)):
|
||||
# Fetch the Dewar with nested relationships
|
||||
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
||||
@ -441,6 +438,7 @@ async def get_dewar_samples(dewar_id: int, db: Session = Depends(get_db)):
|
||||
# Explicitly map nested relationships
|
||||
dewar_data = {
|
||||
"id": dewar.id,
|
||||
"pgroups": dewar.pgroups,
|
||||
"dewar_name": dewar.dewar_name,
|
||||
"tracking_number": dewar.tracking_number,
|
||||
"status": dewar.status,
|
||||
@ -448,14 +446,10 @@ async def get_dewar_samples(dewar_id: int, db: Session = Depends(get_db)):
|
||||
"number_of_samples": sum(
|
||||
len(puck.samples) for puck in dewar.pucks
|
||||
), # Calculate total samples
|
||||
"ready_date": dewar.ready_date,
|
||||
"shipping_date": dewar.shipping_date,
|
||||
"arrival_date": dewar.arrival_date,
|
||||
"returning_date": dewar.returning_date,
|
||||
"contact_person_id": dewar.contact_person.id if dewar.contact_person else None,
|
||||
"contact_id": dewar.contact.id if dewar.contact else None,
|
||||
"return_address_id": dewar.return_address.id if dewar.return_address else None,
|
||||
"shipment_id": dewar.shipment_id,
|
||||
"contact_person": dewar.contact_person,
|
||||
"contact": dewar.contact,
|
||||
"return_address": dewar.return_address,
|
||||
"pucks": [
|
||||
Puck(
|
||||
@ -492,7 +486,7 @@ async def get_dewar_samples(dewar_id: int, db: Session = Depends(get_db)):
|
||||
return Dewar(**dewar_data)
|
||||
|
||||
|
||||
@router.get("/", response_model=List[DewarSchema])
|
||||
@dewar_router.get("/", response_model=List[Dewar])
|
||||
async def get_dewars(db: Session = Depends(get_db)):
|
||||
try:
|
||||
dewars = db.query(DewarModel).options(joinedload(DewarModel.pucks)).all()
|
||||
@ -502,12 +496,12 @@ async def get_dewars(db: Session = Depends(get_db)):
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.get("/dewar-types", response_model=List[DewarTypeSchema])
|
||||
@dewar_router.get("/dewar-types", response_model=List[DewarTypeSchema])
|
||||
def get_dewar_types(db: Session = Depends(get_db)):
|
||||
return db.query(DewarTypeModel).all()
|
||||
|
||||
|
||||
@router.get(
|
||||
@dewar_router.get(
|
||||
"/dewar-types/{type_id}/serial-numbers",
|
||||
response_model=List[DewarSerialNumberSchema],
|
||||
)
|
||||
@ -519,7 +513,7 @@ def get_serial_numbers(type_id: int, db: Session = Depends(get_db)):
|
||||
)
|
||||
|
||||
|
||||
@router.post("/dewar-types", response_model=DewarTypeSchema)
|
||||
@dewar_router.post("/dewar-types", response_model=DewarTypeSchema)
|
||||
def create_dewar_type(dewar_type: DewarTypeCreate, db: Session = Depends(get_db)):
|
||||
db_type = DewarTypeModel(**dewar_type.dict())
|
||||
db.add(db_type)
|
||||
@ -528,7 +522,7 @@ def create_dewar_type(dewar_type: DewarTypeCreate, db: Session = Depends(get_db)
|
||||
return db_type
|
||||
|
||||
|
||||
@router.post("/dewar-serial-numbers", response_model=DewarSerialNumberSchema)
|
||||
@dewar_router.post("/dewar-serial-numbers", response_model=DewarSerialNumberSchema)
|
||||
def create_dewar_serial_number(
|
||||
serial_number: DewarSerialNumberCreate, db: Session = Depends(get_db)
|
||||
):
|
||||
@ -539,7 +533,7 @@ def create_dewar_serial_number(
|
||||
return db_serial
|
||||
|
||||
|
||||
@router.get("/dewar-serial-numbers", response_model=List[DewarSerialNumberSchema])
|
||||
@dewar_router.get("/dewar-serial-numbers", response_model=List[DewarSerialNumberSchema])
|
||||
def get_all_serial_numbers(db: Session = Depends(get_db)):
|
||||
try:
|
||||
serial_numbers = db.query(DewarSerialNumberModel).all()
|
||||
@ -549,13 +543,13 @@ def get_all_serial_numbers(db: Session = Depends(get_db)):
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.get("/{dewar_id}", response_model=DewarSchema)
|
||||
@dewar_router.get("/{dewar_id}", response_model=Dewar)
|
||||
async def get_dewar(dewar_id: int, db: Session = Depends(get_db)):
|
||||
dewar = (
|
||||
db.query(DewarModel)
|
||||
.options(
|
||||
joinedload(DewarModel.pucks).joinedload(PuckModel.samples),
|
||||
joinedload(DewarModel.contact_person),
|
||||
joinedload(DewarModel.contact),
|
||||
joinedload(DewarModel.return_address),
|
||||
joinedload(DewarModel.shipment),
|
||||
)
|
||||
@ -569,10 +563,10 @@ async def get_dewar(dewar_id: int, db: Session = Depends(get_db)):
|
||||
return DewarSchema.from_orm(dewar)
|
||||
|
||||
|
||||
@router.put("/{dewar_id}", response_model=DewarSchema)
|
||||
@dewar_router.put("/{dewar_id}", response_model=Dewar)
|
||||
async def update_dewar(
|
||||
dewar_id: int, dewar_update: DewarUpdate, db: Session = Depends(get_db)
|
||||
) -> DewarSchema:
|
||||
) -> Dewar:
|
||||
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
||||
|
||||
if not dewar:
|
||||
@ -587,7 +581,7 @@ async def update_dewar(
|
||||
return dewar
|
||||
|
||||
|
||||
@router.delete("/{dewar_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
@dewar_router.delete("/{dewar_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
async def delete_dewar(dewar_id: int, db: Session = Depends(get_db)):
|
||||
# Fetch the Dewar from the database
|
||||
dewar = db.query(DewarModel).filter(DewarModel.id == dewar_id).first()
|
||||
@ -642,18 +636,7 @@ async def delete_dewar(dewar_id: int, db: Session = Depends(get_db)):
|
||||
return
|
||||
|
||||
|
||||
# New routes for shipments
|
||||
@router.get("/shipments", response_model=List[ShipmentSchema])
|
||||
async def get_all_shipments(db: Session = Depends(get_db)):
|
||||
try:
|
||||
shipments = get_shipments(db)
|
||||
return shipments
|
||||
except SQLAlchemyError as e:
|
||||
logging.error(f"Database error occurred: {e}")
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.get("/shipments/{id}", response_model=ShipmentSchema)
|
||||
@dewar_router.get("/shipments/{id}", response_model=ShipmentSchema)
|
||||
async def get_single_shipment(id: int, db: Session = Depends(get_db)):
|
||||
try:
|
||||
shipment = get_shipment_by_id(db, id)
|
||||
|
Reference in New Issue
Block a user