Enhance Dewar handling and display in logistics system

Added new fields and enriched data representations in DewarStatusTab, backend schemas, and APIs to improve dewar tracking and management. Introduced new API endpoint `/dewar/table` for simplified data rendering. Applied logging and validations for missing relationships.
This commit is contained in:
GotthardG
2025-02-05 21:43:17 +01:00
parent 25673ae05c
commit 43d67b1044
3 changed files with 243 additions and 38 deletions

View File

@ -7,7 +7,14 @@ from ..models import (
Slot as SlotModel,
LogisticsEvent as LogisticsEventModel,
)
from ..schemas import LogisticsEventCreate, SlotSchema, Dewar as DewarSchema
from ..schemas import (
LogisticsEventCreate,
SlotSchema,
Dewar as DewarSchema,
DewarTable,
ContactMinimal,
AddressMinimal,
)
from ..database import get_db
import logging
from datetime import datetime, timedelta
@ -342,6 +349,64 @@ async def get_all_dewars(db: Session = Depends(get_db)):
return dewars
@router.get("/dewar/table", response_model=List[DewarTable])
async def get_all_dewars_table(db: Session = Depends(get_db)):
dewars = db.query(DewarModel).all()
# Flatten relationships for simplified frontend rendering
response = []
for dewar in dewars:
response.append(
DewarTable(
id=dewar.id,
shipment_id=dewar.shipment_id
if hasattr(dewar, "shipment_id")
else None,
dewar_name=dewar.dewar_name,
shipment_name=dewar.shipment.shipment_name if dewar.shipment else "N/A",
# Use the most recent event if available
status=dewar.events[-1].event_type if dewar.events else "No Events",
tracking_number=dewar.tracking_number or "N/A",
slot_id=dewar.slot[0].id
if dewar.slot
else None, # Use first slot if available
contact=[
ContactMinimal(
firstname=dewar.contact.firstname,
lastname=dewar.contact.lastname,
email=dewar.contact.email,
id=dewar.contact.id,
)
]
if dewar.contact
else [],
address=[
AddressMinimal(
house_number=dewar.return_address.house_number,
street=dewar.return_address.street,
city=dewar.return_address.city,
state=dewar.return_address.state,
country=dewar.return_address.country,
zipcode=dewar.return_address.zipcode,
id=dewar.return_address.id,
)
]
if dewar.return_address
else [],
events=dewar.events[-1].slot_id if dewar.events else "No Events",
last_updated=dewar.events[-1].timestamp if dewar.events else None,
)
)
# Add logging for missing relationships
if not hasattr(dewar, "pgroups"):
logger.warning(f"Dewar {dewar.id} is missing 'pgroups'")
if not hasattr(dewar, "shipment_id"):
logger.warning(f"Dewar {dewar.id} is missing 'shipment_id'")
return response
@router.get("/dewar/{unique_id}", response_model=DewarSchema)
async def get_dewar_by_unique_id(unique_id: str, db: Session = Depends(get_db)):
logger.info(f"Received request for dewar with unique_id: {unique_id}")