now associating a dewar to a slot
This commit is contained in:
@ -1,22 +1,42 @@
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List
|
||||
from app.models import Dewar as DewarModel, Slot as SlotModel, LogisticsEvent as LogisticsEventModel
|
||||
from app.schemas import LogisticsEventCreate, Slot as SlotSchema, Dewar as DewarSchema
|
||||
from app.database import get_db
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def calculate_time_until_refill(last_refill: datetime) -> int:
|
||||
refill_interval = timedelta(hours=24) # Example interval
|
||||
now = datetime.now()
|
||||
time_until_next_refill = last_refill + refill_interval - now
|
||||
return int(time_until_next_refill.total_seconds())
|
||||
|
||||
@router.get("/slots", response_model=List[SlotSchema])
|
||||
async def get_all_slots(db: Session = Depends(get_db)):
|
||||
slots = db.query(SlotModel).all()
|
||||
return slots
|
||||
slots_with_refill_time = []
|
||||
for slot in slots:
|
||||
slot_data = SlotSchema(
|
||||
id=slot.id,
|
||||
qr_code=slot.qr_code,
|
||||
label=slot.label,
|
||||
qr_base=slot.qr_base,
|
||||
occupied=slot.occupied,
|
||||
needs_refill=slot.needs_refill,
|
||||
last_refill=slot.last_refill,
|
||||
time_until_refill=calculate_time_until_refill(slot.last_refill),
|
||||
dewar_unique_id=slot.dewar_unique_id,
|
||||
dewar_name=slot.dewar.dewar_name if slot.dewar else None
|
||||
)
|
||||
slots_with_refill_time.append(slot_data)
|
||||
return slots_with_refill_time
|
||||
|
||||
@router.get("/dewars", response_model=List[DewarSchema])
|
||||
async def get_all_dewars(db: Session = Depends(get_db)):
|
||||
@ -39,20 +59,25 @@ async def scan_dewar(event_data: LogisticsEventCreate, db: Session = Depends(get
|
||||
location_qr_code = event_data.location_qr_code
|
||||
transaction_type = event_data.transaction_type
|
||||
|
||||
print(f"Scanning dewar {dewar_qr_code} for slot {location_qr_code} with transaction type {transaction_type}")
|
||||
|
||||
dewar = db.query(DewarModel).filter(DewarModel.unique_id == dewar_qr_code).first()
|
||||
if not dewar:
|
||||
raise HTTPException(status_code=404, detail="Dewar not found")
|
||||
|
||||
slot = db.query(SlotModel).filter(SlotModel.qr_code == location_qr_code).first()
|
||||
|
||||
if transaction_type == 'incoming':
|
||||
if not slot or slot.occupied:
|
||||
raise HTTPException(status_code=400, detail="Slot not found or already occupied")
|
||||
slot.dewar_id = dewar.id
|
||||
print(f"Associating dewar {dewar.unique_id} with slot {slot.qr_code}")
|
||||
slot.dewar_unique_id = dewar.unique_id # Properly associate with the unique_id
|
||||
slot.occupied = True
|
||||
elif transaction_type == 'outgoing':
|
||||
if not slot or not slot.occupied or slot.dewar_id != dewar.id:
|
||||
if not slot or not slot.occupied or slot.dewar_unique_id != dewar.unique_id:
|
||||
raise HTTPException(status_code=400, detail="Slot not found or dewar not associated with slot")
|
||||
slot.dewar_id = None
|
||||
print(f"Disassociating dewar {dewar.unique_id} from slot {slot.qr_code}")
|
||||
slot.dewar_unique_id = None # Remove the association
|
||||
slot.occupied = False
|
||||
|
||||
log_event(db, dewar.id, slot.id if slot else None, transaction_type)
|
||||
|
Reference in New Issue
Block a user