70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
# Adjusting the ShipmentProcessor for better error handling and alignment
|
|
|
|
from sqlalchemy.orm import Session
|
|
from app.models import Shipment, Dewar, Puck, Sample, DataCollectionParameters
|
|
from app.schemas import ShipmentCreate, ShipmentResponse
|
|
import logging
|
|
|
|
|
|
class ShipmentProcessor:
|
|
def __init__(self, db: Session):
|
|
self.db = db
|
|
|
|
def process_shipment(self, shipment: ShipmentCreate) -> ShipmentResponse:
|
|
logger = logging.getLogger(__name__)
|
|
try:
|
|
new_shipment = Shipment(
|
|
shipment_name=shipment.shipment_name,
|
|
shipment_date=shipment.shipment_date,
|
|
shipment_status=shipment.shipment_status,
|
|
)
|
|
self.db.add(new_shipment)
|
|
self.db.commit()
|
|
self.db.refresh(new_shipment)
|
|
|
|
for dewar_data in shipment.dewars:
|
|
dewar = Dewar(
|
|
shipment_id=new_shipment.id,
|
|
dewar_name=dewar_data.dewar_name,
|
|
tracking_number=dewar_data.tracking_number,
|
|
status=dewar_data.status,
|
|
contact_person_id=dewar_data.contact_person_id,
|
|
return_address_id=dewar_data.return_address_id,
|
|
)
|
|
self.db.add(dewar)
|
|
self.db.commit()
|
|
self.db.refresh(dewar)
|
|
|
|
for puck_data in dewar_data.pucks:
|
|
puck = Puck(
|
|
dewar_id=dewar.id,
|
|
puck_name=puck_data.puck_name,
|
|
puck_type=puck_data.puck_type,
|
|
puck_location_in_dewar=puck_data.puck_location_in_dewar,
|
|
)
|
|
self.db.add(puck)
|
|
self.db.commit()
|
|
self.db.refresh(puck)
|
|
|
|
for sample_data in puck_data.samples:
|
|
data_collection_params = DataCollectionParameters(
|
|
**sample_data.data_collection_parameters.dict(by_alias=True))
|
|
sample = Sample(
|
|
puck_id=puck.id,
|
|
sample_name=sample_data.sample_name,
|
|
position=sample_data.position,
|
|
data_collection_parameters=data_collection_params
|
|
)
|
|
self.db.add(sample)
|
|
self.db.commit()
|
|
self.db.refresh(sample)
|
|
|
|
return ShipmentResponse(
|
|
shipment_id=new_shipment.id,
|
|
status="success",
|
|
message="Shipment processed successfully"
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Error processing shipment: {str(e)}")
|
|
raise e
|