Make shipment fields optional and refactor test scripts.

Updated the `number_of_pucks` and `number_of_samples` fields in the `schemas.py` to be optional for greater flexibility. Simplified the test Jupyter Notebook by restructuring imports and consolidating function calls for better readability and maintainability.
This commit is contained in:
GotthardG 2025-01-17 09:36:16 +01:00
parent 481068603b
commit 9739b8cfe9
6 changed files with 485 additions and 309 deletions

View File

@ -8,7 +8,6 @@ from sqlalchemy.orm import Session, joinedload
from typing import List from typing import List
import logging import logging
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from pydantic import ValidationError, BaseModel
from app.schemas import ( from app.schemas import (
Dewar as DewarSchema, Dewar as DewarSchema,
DewarCreate, DewarCreate,
@ -65,28 +64,85 @@ def generate_unique_id(db: Session, length: int = 16) -> str:
@router.post("/", response_model=DewarSchema, status_code=status.HTTP_201_CREATED) @router.post("/", response_model=DewarSchema, status_code=status.HTTP_201_CREATED)
async def create_dewar( async def create_or_update_dewar(
dewar: DewarCreate, db: Session = Depends(get_db) shipment_id: int,
dewar: DewarCreate,
db: Session = Depends(get_db),
) -> DewarSchema: ) -> DewarSchema:
try: try:
db_dewar = DewarModel( # Query existing dewar by name within the shipment
dewar_name=dewar.dewar_name, existing_dewar = (
tracking_number=dewar.tracking_number, db.query(DewarModel)
status=dewar.status, .filter(
ready_date=dewar.ready_date, DewarModel.dewar_name == dewar.dewar_name,
shipping_date=dewar.shipping_date, DewarModel.shipment_id == shipment_id,
arrival_date=dewar.arrival_date, )
returning_date=dewar.returning_date, .first()
contact_person_id=dewar.contact_person_id,
return_address_id=dewar.return_address_id,
) )
db.add(db_dewar)
db.commit()
db.refresh(db_dewar)
if existing_dewar:
logging.debug(
f"Updating existing dewar with name "
f"{dewar.dewar_name} in shipment {shipment_id}"
)
# Check for associated puck events
for puck in existing_dewar.pucks:
puck_event_exists = (
db.query(PuckEvent).filter(PuckEvent.puck_id == puck.id).first()
)
if puck_event_exists:
raise HTTPException(
status_code=400,
detail=f"Puck {puck.id} "
f"associated with Dewar {existing_dewar.id}"
f" has events. "
f"Update not allowed.",
)
# Check for associated sample events within each puck
for sample in puck.samples:
sample_event_exists = (
db.query(SampleEvent)
.filter(SampleEvent.sample_id == sample.id)
.first()
)
if sample_event_exists:
raise HTTPException(
status_code=400,
detail=f"Sample {sample.id} "
f"associated with Puck "
f"{puck.id} in Dewar "
f"{existing_dewar.id} "
f"has events. Update not allowed.",
)
# Delete associated pucks and samples if no events are found
for puck in existing_dewar.pucks:
for sample in puck.samples:
db.delete(sample)
db.delete(puck)
db.commit()
# Update dewar metadata
for key, value in dewar.dict(
exclude={"pucks", "number_of_pucks", "number_of_samples"}
).items():
if (
hasattr(existing_dewar, key)
and hasattr(type(existing_dewar), key)
and isinstance(getattr(type(existing_dewar), key), property)
and getattr(type(existing_dewar), key).fset
):
setattr(existing_dewar, key, value)
# Commit updates to existing dewar
db.commit()
# Add new pucks and samples
for puck_data in dewar.pucks: for puck_data in dewar.pucks:
puck = PuckModel( puck = PuckModel(
dewar_id=db_dewar.id, dewar_id=existing_dewar.id,
puck_name=puck_data.puck_name, puck_name=puck_data.puck_name,
puck_type=puck_data.puck_type, puck_type=puck_data.puck_type,
puck_location_in_dewar=puck_data.puck_location_in_dewar, puck_location_in_dewar=puck_data.puck_location_in_dewar,
@ -96,26 +152,6 @@ async def create_dewar(
db.refresh(puck) db.refresh(puck)
for sample_data in puck_data.samples: for sample_data in puck_data.samples:
logging.debug(
f"data_collection_parameters: "
f"{sample_data.data_collection_parameters}"
)
if sample_data.data_collection_parameters is None:
serialized_params = {}
elif hasattr(sample_data.data_collection_parameters, "to_dict"):
serialized_params = sample_data.data_collection_parameters.to_dict()
elif isinstance(sample_data.data_collection_parameters, BaseModel):
serialized_params = sample_data.data_collection_parameters.dict(
exclude_unset=True
)
elif isinstance(sample_data.data_collection_parameters, dict):
serialized_params = sample_data.data_collection_parameters
else:
raise ValueError(
"data_collection_parameters must be a dictionary,"
"have a to_dict method, or be None"
)
sample = SampleModel( sample = SampleModel(
puck_id=puck.id, puck_id=puck.id,
sample_name=sample_data.sample_name, sample_name=sample_data.sample_name,
@ -123,20 +159,67 @@ async def create_dewar(
position=sample_data.position, position=sample_data.position,
priority=sample_data.priority, priority=sample_data.priority,
comments=sample_data.comments, comments=sample_data.comments,
data_collection_parameters=serialized_params, data_collection_parameters=dict(
sample_data.data_collection_parameters or {}
),
) )
db.add(sample) db.add(sample)
db.commit() db.commit()
db.refresh(sample) db.refresh(sample)
return db_dewar db.refresh(existing_dewar)
return existing_dewar
# Create a completely new dewar if none exists
dewar_obj = DewarModel(
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,
return_address_id=dewar.return_address_id,
shipment_id=shipment_id, # Associate with the shipment
)
db.add(dewar_obj)
db.commit()
db.refresh(dewar_obj)
# Add pucks and samples for the new dewar
for puck_data in dewar.pucks:
puck = PuckModel(
dewar_id=dewar_obj.id,
puck_name=puck_data.puck_name,
puck_type=puck_data.puck_type,
puck_location_in_dewar=puck_data.puck_location_in_dewar,
)
db.add(puck)
db.commit()
db.refresh(puck)
for sample_data in puck_data.samples:
sample = SampleModel(
puck_id=puck.id,
sample_name=sample_data.sample_name,
proteinname=sample_data.proteinname,
position=sample_data.position,
priority=sample_data.priority,
comments=sample_data.comments,
data_collection_parameters=dict(
sample_data.data_collection_parameters or {}
),
)
db.add(sample)
db.commit()
db.refresh(sample)
return dewar_obj
except SQLAlchemyError as e: except SQLAlchemyError as e:
logging.error(f"Database error occurred: {e}") logging.error(f"Database error occurred: {e}")
raise HTTPException(status_code=500, detail="Internal server error") raise HTTPException(status_code=500, detail="Internal server error")
except ValidationError as e:
logging.error(f"Validation error occurred: {e}")
raise HTTPException(status_code=400, detail="Validation error")
@router.post("/{dewar_id}/generate-qrcode") @router.post("/{dewar_id}/generate-qrcode")

View File

@ -2,9 +2,7 @@ from fastapi import APIRouter, HTTPException, status, Query, Depends
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import List, Optional from typing import List, Optional
import logging import logging
from pydantic import ValidationError
from datetime import date from datetime import date
from sqlalchemy.exc import SQLAlchemyError
import json import json
from app.models import ( from app.models import (
@ -13,8 +11,6 @@ from app.models import (
Address as AddressModel, Address as AddressModel,
Proposal as ProposalModel, Proposal as ProposalModel,
Dewar as DewarModel, Dewar as DewarModel,
Puck as PuckModel,
Sample as SampleModel,
LogisticsEvent, LogisticsEvent,
SampleEvent, SampleEvent,
PuckEvent, PuckEvent,
@ -25,7 +21,6 @@ from app.schemas import (
Shipment as ShipmentSchema, Shipment as ShipmentSchema,
ContactPerson as ContactPersonSchema, ContactPerson as ContactPersonSchema,
Sample as SampleSchema, Sample as SampleSchema,
DewarCreate,
DewarSchema, DewarSchema,
) )
from app.database import get_db from app.database import get_db
@ -334,8 +329,13 @@ async def remove_dewar_from_shipment(
f"has associated events. Removal not allowed.", f"has associated events. Removal not allowed.",
) )
# Unlink the dewar from the shipment # Perform cascade deletion: Delete samples, pucks, and the dewar
shipment.dewars = [dw for dw in shipment.dewars if dw.id != dewar_id] for puck in dewar.pucks:
for sample in puck.samples:
db.delete(sample) # Delete associated samples
db.delete(puck) # Delete associated puck
db.delete(dewar) # Finally, delete the dewar itself
db.commit() db.commit()
db.refresh(shipment) db.refresh(shipment)
@ -399,68 +399,3 @@ async def update_shipment_comments(
db.commit() db.commit()
db.refresh(shipment) db.refresh(shipment)
return shipment return shipment
@router.post(
"/{shipment_id}/add_dewar_puck_sample",
response_model=ShipmentSchema,
status_code=status.HTTP_201_CREATED,
)
def add_dewar_puck_sample_to_shipment(
shipment_id: int, payload: DewarCreate, db: Session = Depends(get_db)
):
shipment = db.query(ShipmentModel).filter(ShipmentModel.id == shipment_id).first()
if not shipment:
raise HTTPException(status_code=404, detail="Shipment not found")
try:
for dewar_data in payload.dewars:
dewar = (
db.query(DewarModel)
.filter(DewarModel.dewar_name == dewar_data.dewar_name)
.first()
)
if dewar:
# Update existing dewar
dewar.tracking_number = dewar_data.tracking_number
dewar.status = dewar_data.status
db.commit()
else:
dewar = DewarModel(
shipment_id=shipment_id,
dewar_name=dewar_data.dewar_name,
tracking_number=dewar_data.tracking_number,
status=dewar_data.status,
)
db.add(dewar)
db.commit()
db.refresh(dewar)
for puck_data in dewar_data.pucks:
puck = PuckModel(
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,
)
db.add(puck)
db.commit()
db.refresh(puck)
for sample_data in puck_data.samples:
sample = SampleModel(
puck_id=puck.id,
sample_name=sample_data.sample_name,
position=sample_data.position,
)
db.add(sample)
db.commit()
db.refresh(sample)
db.refresh(shipment)
except SQLAlchemyError as e:
raise HTTPException(status_code=500, detail=f"Database error: {e}")
except ValidationError as e:
raise HTTPException(status_code=400, detail=f"Validation error: {e}")
return shipment

View File

@ -493,8 +493,8 @@ class DewarBase(BaseModel):
dewar_serial_number_id: Optional[int] = None dewar_serial_number_id: Optional[int] = None
unique_id: Optional[str] = None unique_id: Optional[str] = None
tracking_number: str tracking_number: str
number_of_pucks: int number_of_pucks: Optional[int] = None
number_of_samples: int number_of_samples: Optional[int] = None
status: str status: str
ready_date: Optional[date] ready_date: Optional[date]
shipping_date: Optional[date] shipping_date: Optional[date]

View File

@ -126,7 +126,7 @@ const ShipmentDetails: React.FC<ShipmentDetailsProps> = ({
throw new Error('Missing required fields'); throw new Error('Missing required fields');
} }
const createdDewar = await DewarsService.createDewarDewarsPost(newDewarToPost); const createdDewar = await DewarsService.createOrUpdateDewarDewarsPost(selectedShipment.id, newDewarToPost);
if (createdDewar && selectedShipment) { if (createdDewar && selectedShipment) {
const updatedShipment = await ShipmentsService.addDewarToShipmentShipmentsShipmentIdAddDewarPost(selectedShipment.id, createdDewar.id); const updatedShipment = await ShipmentsService.addDewarToShipmentShipmentsShipmentIdAddDewarPost(selectedShipment.id, createdDewar.id);

View File

@ -63,7 +63,6 @@ const SpreadsheetTable = ({
shipping_date: null, shipping_date: null,
arrival_date: null, arrival_date: null,
returning_date: null, returning_date: null,
qrcode: 'N/A',
contact_person_id: selectedShipment?.contact_person?.id, contact_person_id: selectedShipment?.contact_person?.id,
return_address_id: selectedShipment?.return_address?.id, return_address_id: selectedShipment?.return_address?.id,
dewar_name: '', dewar_name: '',
@ -236,14 +235,23 @@ const SpreadsheetTable = ({
'chiphiangles': 31 'chiphiangles': 31
}; };
const checkIfDewarExists = async (dewarName) => { const checkIfDewarExists = async (dewarName: string) => {
if (!selectedShipment) return null; if (!selectedShipment) return null;
try { try {
// Fetch dewars related to the current shipment via API
const shipDewars = await ShipmentsService.getDewarsByShipmentIdShipmentsShipmentIdDewarsGet(selectedShipment.id); const shipDewars = await ShipmentsService.getDewarsByShipmentIdShipmentsShipmentIdDewarsGet(selectedShipment.id);
return shipDewars.find((d) => d.dewar_name === dewarName);
// Search for dewar by name within the shipment
const existingDewar = shipDewars.find((d) => d.dewar_name === dewarName);
if (existingDewar) {
console.log(`Dewar "${dewarName}" exists with ID: ${existingDewar.id}`);
return existingDewar;
}
return null;
} catch (error) { } catch (error) {
console.error('Failed to fetch existing dewars:', error); console.error("Failed to fetch existing dewars:", error);
return null; return null;
} }
}; };
@ -258,75 +266,34 @@ const SpreadsheetTable = ({
const puckPositionMap = new Map(); const puckPositionMap = new Map();
const dewarsToReplace = []; const dewarsToReplace = [];
const dewarNameIdx = fieldToCol['dewarname'];
const puckNameIdx = fieldToCol['puckname'];
const puckTypeIdx = fieldToCol['pucktype'];
const sampleNameIdx = fieldToCol['crystalname'];
const proteinNameIdx = fieldToCol['proteinname'];
const samplePositionIdx = fieldToCol['positioninpuck'];
const priorityIdx = fieldToCol['priority'];
const commentsIdx = fieldToCol['comments'];
for (let rowIndex = 0; rowIndex < data.length; rowIndex++) { for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {
const row = data[rowIndex]; const row = data[rowIndex];
if (!row.data) { if (!row.data) {
console.error('Row data is missing'); console.error(`Row ${rowIndex}: Missing or invalid data`);
continue; continue;
} }
// Extract values from the appropriate columns const dewarName = sanitizeAndValidateColumn(row, fieldToCol['dewarname'], 'string', 'Dewar Name');
const dewarName = typeof row.data[dewarNameIdx] === 'string' ? row.data[dewarNameIdx].trim() : null; const puckName = sanitizeAndValidateColumn(row, fieldToCol['puckname'], 'string', 'Puck Name');
const puckName = row.data[puckNameIdx] !== undefined && row.data[puckNameIdx] !== null ? String(row.data[puckNameIdx]).trim() : null; const puckType = sanitizeAndValidateColumn(row, fieldToCol['pucktype'], 'string', 'Unipuck', true); // Default: `Unipuck`
const puckType = typeof row.data[puckTypeIdx] === 'string' ? row.data[puckTypeIdx] : 'Unipuck'; const sampleName = sanitizeAndValidateColumn(row, fieldToCol['crystalname'], 'string', 'Sample Name');
const sampleName = typeof row.data[sampleNameIdx] === 'string' ? row.data[sampleNameIdx].trim() : null;
const proteinName = typeof row.data[proteinNameIdx] === 'string' ? row.data[proteinNameIdx].trim() : null;
const samplePosition = row.data[samplePositionIdx] !== undefined && row.data[samplePositionIdx] !== null ? Number(row.data[samplePositionIdx]) : null;
const priority = row?.data?.[priorityIdx] ? Number(row.data[priorityIdx]) : null;
const comments = typeof row.data[commentsIdx] === 'string' ? row.data[commentsIdx].trim() : null;
// Create data_collection_parameters object
const dataCollectionParameters = {
directory: row.data[fieldToCol['directory']],
oscillation: row.data[fieldToCol['oscillation']] ? parseFloat(row.data[fieldToCol['oscillation']]) : undefined,
aperture: row.data[fieldToCol['aperture']] ? row.data[fieldToCol['aperture']].trim() : undefined,
exposure: row.data[fieldToCol['exposure']] ? parseFloat(row.data[fieldToCol['exposure']]) : undefined,
totalrange: row.data[fieldToCol['totalrange']] ? parseInt(row.data[fieldToCol['totalrange']], 10) : undefined,
transmission: row.data[fieldToCol['transmission']] ? parseInt(row.data[fieldToCol['transmission']], 10) : undefined,
dose: row.data[fieldToCol['dose']] ? parseFloat(row.data[fieldToCol['dose']]) : undefined,
targetresolution: row.data[fieldToCol['targetresolution']] ? parseFloat(row.data[fieldToCol['targetresolution']]) : undefined,
datacollectiontype: row.data[fieldToCol['datacollectiontype']],
processingpipeline: row.data[fieldToCol['processingpipeline']],
spacegroupnumber: row.data[fieldToCol['spacegroupnumber']] ? parseInt(row.data[fieldToCol['spacegroupnumber']], 10) : undefined,
cellparameters: row.data[fieldToCol['cellparameters']],
rescutkey: row.data[fieldToCol['rescutkey']],
rescutvalue: row.data[fieldToCol['rescutvalue']] ? parseFloat(row.data[fieldToCol['rescutvalue']]) : undefined,
userresolution: row.data[fieldToCol['userresolution']] ? parseFloat(row.data[fieldToCol['userresolution']]) : undefined,
pdbid: row.data[fieldToCol['pdbid']],
autoprocfull: row.data[fieldToCol['autoprocfull']] === true,
procfull: row.data[fieldToCol['procfull']] === true,
adpenabled: row.data[fieldToCol['adpenabled']] === true,
noano: row.data[fieldToCol['noano']] === true,
ffcscampaign: row.data[fieldToCol['ffcscampaign']] === true,
trustedhigh: row.data[fieldToCol['trustedhigh']] ? parseFloat(row.data[fieldToCol['trustedhigh']]) : undefined,
autoprocextraparams: row.data[fieldToCol['autoprocextraparams']],
chiphiangles: row.data[fieldToCol['chiphiangles']] ? parseFloat(row.data[fieldToCol['chiphiangles']]) : undefined,
};
if (dewarName && puckName) { if (dewarName && puckName) {
let dewar; let dewar;
if (!dewars.has(dewarName)) { if (!dewars.has(dewarName)) {
// Initialize new dewar object
dewar = { dewar = {
...initialNewDewarState, ...initialNewDewarState,
dewar_name: dewarName, dewar_name: dewarName,
contact_person_id: contactPerson.id, contact_person_id: contactPerson.id,
return_address_id: returnAddress.id, return_address_id: returnAddress.id,
pucks: [] pucks: [],
}; };
dewars.set(dewarName, dewar); dewars.set(dewarName, dewar);
puckPositionMap.set(dewarName, new Map()); puckPositionMap.set(dewarName, new Map());
// Check if the dewar exists in the shipment // Check if dewar exists using backend
const existingDewar = await checkIfDewarExists(dewarName); const existingDewar = await checkIfDewarExists(dewarName);
if (existingDewar) { if (existingDewar) {
dewarsToReplace.push(existingDewar); dewarsToReplace.push(existingDewar);
@ -335,78 +302,115 @@ const SpreadsheetTable = ({
dewar = dewars.get(dewarName); dewar = dewars.get(dewarName);
} }
// Handle puck positions
let puckPositions = puckPositionMap.get(dewarName); let puckPositions = puckPositionMap.get(dewarName);
if (!puckPositions.has(puckName)) { if (!puckPositions.has(puckName)) {
puckPositions.set(puckName, puckPositions.size + 1); puckPositions.set(puckName, puckPositions.size + 1);
} }
const puckPosition = puckPositions.get(puckName); const puckPosition = puckPositions.get(puckName);
let puck = dewar.pucks.find(p => p.puck_name === puckName); // Create puck and attach it to the dewar
let puck = dewar.pucks.find((p) => p.puck_name === puckName);
if (!puck) { if (!puck) {
puck = { puck = { puck_name: puckName, puck_type: puckType, puck_location_in_dewar: puckPosition, samples: [] };
puck_name: puckName,
puck_type: puckType,
puck_location_in_dewar: puckPosition,
samples: []
};
dewar.pucks.push(puck); dewar.pucks.push(puck);
} }
// Add sample to puck
const sample = { const sample = {
sample_name: sampleName, sample_name: sampleName,
proteinname: proteinName, position: sanitizeIntColumn(row, fieldToCol['positioninpuck'], 'Sample Position'),
position: samplePosition, proteinname: sanitizeAndValidateColumn(row, fieldToCol['proteinname'], 'string', 'Protein Name'),
priority: priority, priority: sanitizeIntColumn(row, fieldToCol['priority'], 'Priority'),
comments: comments, comments: sanitizeAndValidateColumn(row, fieldToCol['comments'], 'string', 'Comments', true),
data_collection_parameters: dataCollectionParameters, // Attach the parameters data_collection_parameters: collectDataParameters(row), // Consolidate data parameters
results: null // Placeholder for results field
}; };
if (isNaN(sample.position)) {
console.error(`Invalid sample position for sample ${sample.sample_name} in puck ${puckName}`);
} else {
puck.samples.push(sample); puck.samples.push(sample);
}
} else { } else {
if (!dewarName) { console.error(`Row ${rowIndex} is missing required fields for dewar/puck creation.`);
console.error(`Dewar name is missing in row ${rowIndex}`);
}
if (!puckName) {
console.error(`Puck name is missing in row ${rowIndex}`);
}
} }
} }
const dewarsArray = Array.from(dewars.values()); const dewarsArray = Array.from(dewars.values());
// Save dewars array for later use in handleConfirmUpdate // Save for update dialog control
setDewarsToCreate(dewars); setDewarsToCreate(dewars);
if (dewarsArray.length > 0 && dewarsToReplace.length > 0) { if (dewarsArray.length > 0 && dewarsToReplace.length > 0) {
setDewarsToReplace(dewarsToReplace); setDewarsToReplace(dewarsToReplace);
setShowUpdateDialog(true); setShowUpdateDialog(true);
} else { } else if (dewarsArray.length > 0) {
await handleDewarCreation(dewarsArray); await handleDewarCreation(dewarsArray);
} }
}; };
const sanitizeAndValidateColumn = (row, colIndex, type, columnName, isOptional = false) => {
const value = row?.data?.[colIndex];
const sanitizedValue = type === 'string' ? value?.trim() : value;
if (!sanitizedValue && !isOptional) {
console.error(`${columnName} is missing or invalid.`);
return null;
}
if (type === 'number' && isNaN(sanitizedValue)) {
console.error(`${columnName} is not a valid number.`);
}
return sanitizedValue;
};
// Utility to sanitize integer columns
const sanitizeIntColumn = (row, colIndex, columnName) => {
const rawValue = row?.data?.[colIndex];
const intValue = parseInt(rawValue, 10);
if (isNaN(intValue)) {
console.error(`${columnName} is not a valid integer.`);
}
return intValue;
};
// Consolidate data collection parameters
const collectDataParameters = (row) => ({
directory: sanitizeAndValidateColumn(row, fieldToCol['directory'], 'string', 'Directory', true),
oscillation: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['oscillation'], 'number', 'Oscillation', true)),
aperture: sanitizeAndValidateColumn(row, fieldToCol['aperture'], 'string', 'Aperture', true),
exposure: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['exposure'], 'number', 'Exposure', true)),
totalrange: sanitizeIntColumn(row, fieldToCol['totalrange'], 'Total Range'),
transmission: sanitizeIntColumn(row, fieldToCol['transmission'], 'Transmission'),
dose: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['dose'], 'number', 'Dose', true)),
targetresolution: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['targetresolution'], 'number', 'Target Resolution', true)),
datacollectiontype: sanitizeAndValidateColumn(row, fieldToCol['datacollectiontype'], 'string', 'Data Collection Type', true),
processingpipeline: sanitizeAndValidateColumn(row, fieldToCol['processingpipeline'], 'string', 'Processing Pipeline', true),
spacegroupnumber: sanitizeIntColumn(row, fieldToCol['spacegroupnumber'], 'Space Group Number'),
cellparameters: sanitizeAndValidateColumn(row, fieldToCol['cellparameters'], 'string', 'Cell Parameters', true),
rescutkey: sanitizeAndValidateColumn(row, fieldToCol['rescutkey'], 'string', 'Resolution Cut Key', true),
rescutvalue: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['rescutvalue'], 'number', 'Resolution Cut Value', true)),
userresolution: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['userresolution'], 'number', 'User Resolution', true)),
pdbid: sanitizeAndValidateColumn(row, fieldToCol['pdbid'], 'string', 'PDB ID', true),
autoprocfull: row.data[fieldToCol['autoprocfull']] === true,
procfull: row.data[fieldToCol['procfull']] === true,
adpenabled: row.data[fieldToCol['adpenabled']] === true,
noano: row.data[fieldToCol['noano']] === true,
ffcscampaign: row.data[fieldToCol['ffcscampaign']] === true,
trustedhigh: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['trustedhigh'], 'number', 'Trusted High', true)),
autoprocextraparams: sanitizeAndValidateColumn(row, fieldToCol['autoprocextraparams'], 'string', 'Autoproc Extra Params', true),
chiphiangles: parseFloat(sanitizeAndValidateColumn(row, fieldToCol['chiphiangles'], 'number', 'Chi/Phi Angles', true)),
});
const handleConfirmUpdate = async () => { const handleConfirmUpdate = async () => {
if (dewarsToReplace.length === 0) return; if (dewarsToReplace.length === 0) return;
try { try {
for (const dewar of dewarsToReplace) {
await DewarsService.deleteDewarDewarsDewarIdDelete(dewar.id);
}
const dewarsArray = Array.from(dewarsToCreate.values()); const dewarsArray = Array.from(dewarsToCreate.values());
await handleDewarCreation(dewarsArray); await handleDewarCreation(dewarsArray); // Updated logic handles replacement
console.log('Dewars replaced successfully'); console.log('Dewars replaced successfully');
} catch (error) { } catch (error) {
console.error('Error replacing dewar', error); console.error('Error replacing dewars:', error);
if (error instanceof ApiError && error.body) {
console.error('Validation errors:', error.body.detail);
} else {
console.error('Unexpected error:', error);
}
} }
setShowUpdateDialog(false); setShowUpdateDialog(false);
setDewarsToReplace([]); setDewarsToReplace([]);
@ -419,30 +423,18 @@ const SpreadsheetTable = ({
setDewarsToCreate(new Map()); setDewarsToCreate(new Map());
}; };
const handleDewarCreation = async (dewarsArray) => { const handleDewarCreation = async (dewarsArray: any[]) => {
for (const dewar of dewarsArray) { for (const dewar of dewarsArray) {
try { try {
if (!dewar.pucks || dewar.pucks.length === 0) { // Prepare payload and exclude number_of_pucks before sending
console.error(`Dewar ${dewar.dewar_name} does not have any pucks.`); const { number_of_pucks, number_of_samples, ...payload } = dewar;
continue;
}
const createdDewar = await DewarsService.createDewarDewarsPost(dewar); // Call the backend to create or update dewars
await DewarsService.createOrUpdateDewarDewarsPost(selectedShipment.id, payload);
if (createdDewar && selectedShipment) { console.log(`Dewar "${dewar.dewar_name}" processed successfully.`);
await ShipmentsService.addDewarToShipmentShipmentsShipmentIdAddDewarPost(
selectedShipment.id,
createdDewar.id
);
console.log(`Dewar ${createdDewar.dewar_name} with ID ${createdDewar.id} created and added to the shipment.`);
}
} catch (error) { } catch (error) {
console.error('Error adding dewar', error); console.error("Error creating/updating dewar:", error);
if (error instanceof ApiError && error.body) {
console.error('Validation errors:', error.body.detail);
} else {
console.error('Unexpected error:', error);
}
} }
} }
}; };

View File

@ -6,49 +6,249 @@
"metadata": { "metadata": {
"collapsed": true, "collapsed": true,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-10T11:42:48.076458Z", "end_time": "2025-01-16T19:48:49.601896Z",
"start_time": "2025-01-10T11:42:48.071372Z" "start_time": "2025-01-16T19:48:49.599534Z"
} }
}, },
"source": [ "source": [
"import json\n", "import json\n",
"import aareDBclient\n", "import backend.aareDBclient as aareDBclient\n",
"from aareDBclient.rest import ApiException\n", "from aareDBclient.rest import ApiException\n",
"from pprint import pprint\n", "from pprint import pprint\n",
"from aareDBclient import SamplesApi\n", "#from aareDBclient import SamplesApi, ShipmentsApi, PucksApi\n",
"from aareDBclient.models import SampleEventCreate, SetTellPosition\n", "#from aareDBclient.models import SampleEventCreate, SetTellPosition\n",
"#from examples.examples import api_response\n",
"\n", "\n",
"print(aareDBclient.__version__)\n", "print(aareDBclient.__version__)\n",
"\n", "\n",
"configuration = aareDBclient.Configuration(\n", "configuration = aareDBclient.Configuration(\n",
" host = \"https://mx-aare-test.psi.ch:1492\"\n", " #host = \"https://mx-aare-test.psi.ch:1492\"\n",
" #host = \"https://127.0.0.1:8000\"\n", " host = \"https://127.0.0.1:8000\"\n",
")\n", ")\n",
"\n", "\n",
"print(configuration.host)\n",
"\n",
"configuration.verify_ssl = False # Disable SSL verification\n", "configuration.verify_ssl = False # Disable SSL verification\n",
"print(dir(SamplesApi))" "#print(dir(SamplesApi))"
], ],
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"0.1.0a18\n", "0.1.0a19\n",
"['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_create_sample_event_samples_samples_sample_id_events_post_serialize', '_get_all_pucks_with_samples_and_events_samples_pucks_samples_get_serialize', '_get_last_sample_event_samples_samples_sample_id_events_last_get_serialize', '_get_samples_with_events_samples_puck_id_samples_get_serialize', 'create_sample_event_samples_samples_sample_id_events_post', 'create_sample_event_samples_samples_sample_id_events_post_with_http_info', 'create_sample_event_samples_samples_sample_id_events_post_without_preload_content', 'get_all_pucks_with_samples_and_events_samples_pucks_samples_get', 'get_all_pucks_with_samples_and_events_samples_pucks_samples_get_with_http_info', 'get_all_pucks_with_samples_and_events_samples_pucks_samples_get_without_preload_content', 'get_last_sample_event_samples_samples_sample_id_events_last_get', 'get_last_sample_event_samples_samples_sample_id_events_last_get_with_http_info', 'get_last_sample_event_samples_samples_sample_id_events_last_get_without_preload_content', 'get_samples_with_events_samples_puck_id_samples_get', 'get_samples_with_events_samples_puck_id_samples_get_with_http_info', 'get_samples_with_events_samples_puck_id_samples_get_without_preload_content']\n" "https://127.0.0.1:8000\n"
] ]
} }
], ],
"execution_count": 8 "execution_count": 11
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-10T11:42:50.424118Z", "end_time": "2025-01-16T21:02:44.756830Z",
"start_time": "2025-01-10T11:42:50.385515Z" "start_time": "2025-01-16T21:02:44.640622Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
"source": [ "source": [
"## Fetch all Shipments, list corresponding dewars and pucks\n",
"\n",
"from datetime import date\n",
"from aareDBclient import ShipmentsApi\n",
"from aareDBclient.models import Shipment\n",
"\n",
"with aareDBclient.ApiClient(configuration) as api_client:\n",
" api_instance = aareDBclient.ShipmentsApi(api_client)\n",
"\n",
" try:\n",
" # Fetch all shipments\n",
" all_shipments_response = api_instance.fetch_shipments_shipments_get()\n",
"\n",
" # Print shipment names and their associated puck names\n",
" for shipment in all_shipments_response:\n",
" print(f\"Shipment ID: {shipment.id}, Shipment Name: {shipment.shipment_name}\")\n",
" if hasattr(shipment, 'dewars') and shipment.dewars: # Ensure 'dewars' exists\n",
" for dewar in shipment.dewars:\n",
" print(f\" Dewar ID: {dewar.id}, Dewar Name: {dewar.dewar_name}, Dewar Unique ID: {dewar.unique_id} \")\n",
"\n",
" if hasattr(dewar, 'pucks') and dewar.pucks: # Ensure 'pucks' exists\n",
" for puck in dewar.pucks:\n",
" print(f\" Puck ID: {puck.id}, Puck Name: {puck.puck_name}\")\n",
" else:\n",
" print(\" No pucks found in this dewar.\")\n",
" else:\n",
" print(\" No dewars found in this shipment.\")\n",
"\n",
" except ApiException as e:\n",
" print(f\"Exception when calling ShipmentsApi->fetch_shipments_shipments_get: {e}\")\n"
],
"id": "45cc7ab6d4589711",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Shipment ID: 2, Shipment Name: Shipment from Mordor\n",
" Dewar ID: 1, Dewar Name: Dewar One, Dewar Unique ID: bd3cb1a303be0fc9 \n",
" Puck ID: 1, Puck Name: PUCK-001\n",
" Puck ID: 2, Puck Name: PUCK002\n",
" Puck ID: 3, Puck Name: PUCK003\n",
" Puck ID: 4, Puck Name: PUCK004\n",
" Puck ID: 5, Puck Name: PUCK005\n",
" Puck ID: 6, Puck Name: PUCK006\n",
" Puck ID: 7, Puck Name: PUCK007\n",
" Dewar ID: 2, Dewar Name: Dewar Two, Dewar Unique ID: 6d23d26250394f38 \n",
" Puck ID: 8, Puck Name: PK001\n",
" Puck ID: 9, Puck Name: PK002\n",
" Puck ID: 10, Puck Name: PK003\n",
" Puck ID: 11, Puck Name: PK004\n",
" Puck ID: 12, Puck Name: PK005\n",
" Puck ID: 13, Puck Name: PK006\n",
"Shipment ID: 3, Shipment Name: Shipment from Mordor\n",
" Dewar ID: 3, Dewar Name: Dewar Three, Dewar Unique ID: None \n",
" Puck ID: 14, Puck Name: P001\n",
" Puck ID: 15, Puck Name: P002\n",
" Puck ID: 16, Puck Name: P003\n",
" Puck ID: 17, Puck Name: P004\n",
" Puck ID: 18, Puck Name: P005\n",
" Puck ID: 19, Puck Name: P006\n",
" Puck ID: 20, Puck Name: P007\n",
" Dewar ID: 4, Dewar Name: Dewar Four, Dewar Unique ID: None \n",
" Puck ID: 21, Puck Name: PC002\n",
" Puck ID: 22, Puck Name: PC003\n",
" Puck ID: 23, Puck Name: PC004\n",
" Puck ID: 24, Puck Name: PC005\n",
" Puck ID: 25, Puck Name: PC006\n",
" Puck ID: 26, Puck Name: PC007\n",
"Shipment ID: 1, Shipment Name: Shipment from Mordor\n",
" Dewar ID: 5, Dewar Name: Dewar Five, Dewar Unique ID: None \n",
" Puck ID: 27, Puck Name: PKK004\n",
" Puck ID: 28, Puck Name: PKK005\n",
" Puck ID: 29, Puck Name: PKK006\n",
" Puck ID: 30, Puck Name: PKK007\n",
" Dewar ID: 23, Dewar Name: tutu, Dewar Unique ID: None \n",
" No pucks found in this dewar.\n",
" Dewar ID: 24, Dewar Name: Dewar_test, Dewar Unique ID: 84b5630f4e933b4d \n",
" Puck ID: 178, Puck Name: CPS-4093\n",
" Puck ID: 179, Puck Name: CPS-4178\n",
" Puck ID: 180, Puck Name: PSIMX-122\n",
" Puck ID: 181, Puck Name: E-07\n",
" Puck ID: 182, Puck Name: CPS-6597\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n"
]
}
],
"execution_count": 25
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-16T21:27:00.520915Z",
"start_time": "2025-01-16T21:27:00.501009Z"
}
},
"cell_type": "code",
"source": [
"from datetime import date\n",
"from aareDBclient import LogisticsApi\n",
"from aareDBclient.models import LogisticsEventCreate # Import required model\n",
"\n",
"with aareDBclient.ApiClient(configuration) as api_client:\n",
" api_instance = aareDBclient.LogisticsApi(api_client)\n",
"\n",
" #try:\n",
" # # Create payload using the required model\n",
" # logistics_event_create = LogisticsEventCreate(\n",
" # dewar_qr_code='84b5630f4e933b4d',\n",
" # location_qr_code='A1-X06SA',\n",
" # transaction_type='incoming',\n",
" # timestamp=date.today() # Adjust if the API expects datetime\n",
" # )\n",
" #\n",
" # # Pass the payload to the API function\n",
" # api_response = api_instance.scan_dewar_logistics_dewar_scan_post(\n",
" # logistics_event_create=logistics_event_create # Pass as an object\n",
" # )\n",
" # print(\"API Response:\", api_response)\n",
" #\n",
" #except ApiException as e:\n",
" # print(f\"Exception when calling LogisticsApi->scan_dewar_logistics_dewar_scan_post: {e}\")\n",
" #\n",
" #try:\n",
" # # Create payload using the required model\n",
" # logistics_event_create = LogisticsEventCreate(\n",
" # dewar_qr_code='84b5630f4e933b4d',\n",
" # location_qr_code='A1-X06SA',\n",
" # transaction_type='refill',\n",
" # timestamp=date.today() # Adjust if the API expects datetime\n",
" # )\n",
" #\n",
" # # Pass the payload to the API function\n",
" # api_response = api_instance.scan_dewar_logistics_dewar_scan_post(\n",
" # logistics_event_create=logistics_event_create # Pass as an object\n",
" # )\n",
" # print(\"API Response:\", api_response)\n",
" #\n",
" #except ApiException as e:\n",
" # print(f\"Exception when calling LogisticsApi->scan_dewar_logistics_dewar_scan_post: {e}\")\n",
" #\n",
" try:\n",
" # Create payload using the required model\n",
" logistics_event_create = LogisticsEventCreate(\n",
" dewar_qr_code='84b5630f4e933b4d',\n",
" location_qr_code='X06DA-Beamline',\n",
" transaction_type='beamline',\n",
" timestamp=date.today() # Adjust if the API expects datetime\n",
" )\n",
"\n",
" # Pass the payload to the API function\n",
" api_response = api_instance.scan_dewar_logistics_dewar_scan_post(\n",
" logistics_event_create=logistics_event_create # Pass as an object\n",
" )\n",
" print(\"API Response:\", api_response)\n",
"\n",
" except ApiException as e:\n",
" print(f\"Exception when calling LogisticsApi->scan_dewar_logistics_dewar_scan_post: {e}\")\n"
],
"id": "f5de1787214a6642",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"API Response: {'message': 'Status updated successfully'}\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n"
]
}
],
"execution_count": 37
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-16T21:35:54.798099Z",
"start_time": "2025-01-16T21:35:54.775893Z"
}
},
"cell_type": "code",
"source": [
"# Get a list of pucks that are \"at the beamline\"\n",
"\n",
"with aareDBclient.ApiClient(configuration) as api_client:\n", "with aareDBclient.ApiClient(configuration) as api_client:\n",
" # Create an instance of the API class\n", " # Create an instance of the API class\n",
" api_instance = aareDBclient.PucksApi(api_client)\n", " api_instance = aareDBclient.PucksApi(api_client)\n",
@ -71,42 +271,37 @@
"text": [ "text": [
"The response of PucksApi->get_pucks_by_slot_pucks_slot_slot_identifier_get:\n", "The response of PucksApi->get_pucks_by_slot_pucks_slot_slot_identifier_get:\n",
"\n", "\n",
"[PuckWithTellPosition(id=1, puck_name='CPS-4093', puck_type='unipuck', puck_location_in_dewar=1, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position='D1'),\n", "[PuckWithTellPosition(id=188, puck_name='CPS-4093', puck_type='unipuck', puck_location_in_dewar=1, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=2, puck_name='CPS-4178', puck_type='unipuck', puck_location_in_dewar=2, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=189, puck_name='CPS-4178', puck_type='unipuck', puck_location_in_dewar=2, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=3, puck_name='PSIMX-122', puck_type='unipuck', puck_location_in_dewar=3, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=190, puck_name='PSIMX-122', puck_type='unipuck', puck_location_in_dewar=3, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=4, puck_name='E-07', puck_type='unipuck', puck_location_in_dewar=4, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=191, puck_name='E-07', puck_type='unipuck', puck_location_in_dewar=4, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=5, puck_name='CPS-6597', puck_type='unipuck', puck_location_in_dewar=5, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=192, puck_name='CPS-6597', puck_type='unipuck', puck_location_in_dewar=5, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=6, puck_name='PSIMX-078', puck_type='unipuck', puck_location_in_dewar=6, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=193, puck_name='PSIMX-078', puck_type='unipuck', puck_location_in_dewar=6, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=7, puck_name='1002', puck_type='unipuck', puck_location_in_dewar=7, dewar_id=1, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None),\n", " PuckWithTellPosition(id=194, puck_name='1002', puck_type='unipuck', puck_location_in_dewar=7, dewar_id=24, dewar_name='Dewar_test', user='e16371', samples=None, tell_position=None)]\n"
" PuckWithTellPosition(id=15, puck_name='PSIMX123', puck_type='unipuck', puck_location_in_dewar=1, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=16, puck_name='PSIMX125', puck_type='unipuck', puck_location_in_dewar=2, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=17, puck_name='PSIMX127', puck_type='unipuck', puck_location_in_dewar=3, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=18, puck_name='PSIMX128', puck_type='unipuck', puck_location_in_dewar=4, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=19, puck_name='PSIMX130', puck_type='unipuck', puck_location_in_dewar=5, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=20, puck_name='PSIMX131', puck_type='unipuck', puck_location_in_dewar=6, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None),\n",
" PuckWithTellPosition(id=21, puck_name='PSIMX132', puck_type='unipuck', puck_location_in_dewar=7, dewar_id=4, dewar_name='Huang', user='e16371', samples=None, tell_position=None)]\n"
] ]
}, },
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'mx-aare-test.psi.ch'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n" " warnings.warn(\n"
] ]
} }
], ],
"execution_count": 9 "execution_count": 38
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-09T16:38:00.334741Z", "end_time": "2025-01-16T21:39:16.947946Z",
"start_time": "2025-01-09T16:38:00.302589Z" "start_time": "2025-01-16T21:39:16.918422Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
"source": [ "source": [
"# Attribute a puck to a position in the TELL dewar\n",
"\n",
"with aareDBclient.ApiClient(configuration) as api_client:\n", "with aareDBclient.ApiClient(configuration) as api_client:\n",
" # Create an instance of the API class\n", " # Create an instance of the API class\n",
" api_instance = aareDBclient.PucksApi(api_client)\n", " api_instance = aareDBclient.PucksApi(api_client)\n",
@ -115,7 +310,7 @@
" # This part is commented but will be used to attribute a puck to a position of the TELL\n", " # This part is commented but will be used to attribute a puck to a position of the TELL\n",
" # Define the puck ID and payload\n", " # Define the puck ID and payload\n",
"\n", "\n",
" payload = [SetTellPosition(puck_name='CPS-4093', segment='C', puck_in_segment=2),SetTellPosition(puck_name='CPS-4178', segment='C', puck_in_segment=3)]\n", " payload = [SetTellPosition(puck_name='CPS-4178', segment='A', puck_in_segment=2),SetTellPosition(puck_name='CPS-4178', segment='C', puck_in_segment=3)]\n",
" #payload = []\n", " #payload = []\n",
"\n", "\n",
" try:\n", " try:\n",
@ -136,9 +331,9 @@
"The response of PucksApi->pucks_puck_id_tell_position_put:\n", "The response of PucksApi->pucks_puck_id_tell_position_put:\n",
"\n", "\n",
"[{'message': 'The tell_position was updated successfully.',\n", "[{'message': 'The tell_position was updated successfully.',\n",
" 'new_position': 'C2',\n", " 'new_position': 'A2',\n",
" 'previous_position': None,\n", " 'previous_position': None,\n",
" 'puck_name': 'CPS-4093',\n", " 'puck_name': 'CPS-4178',\n",
" 'status': 'updated'},\n", " 'status': 'updated'},\n",
" {'message': 'The tell_position was updated successfully.',\n", " {'message': 'The tell_position was updated successfully.',\n",
" 'new_position': 'C3',\n", " 'new_position': 'C3',\n",
@ -156,13 +351,13 @@
] ]
} }
], ],
"execution_count": 36 "execution_count": 39
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-10T10:17:48.013415Z", "end_time": "2025-01-16T19:45:40.811948Z",
"start_time": "2025-01-10T10:17:47.983861Z" "start_time": "2025-01-16T19:45:40.798389Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@ -191,41 +386,24 @@
"id": "95f8c133359945d5", "id": "95f8c133359945d5",
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "NameError",
"output_type": "stream", "evalue": "name 'aareDBclient' is not defined",
"text": [
"The response of PucksApi->get_all_pucks_in_tell:\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n"
]
},
{
"ename": "AttributeError",
"evalue": "'PuckWithTellPosition' object has no attribute 'sample_id'",
"output_type": "error", "output_type": "error",
"traceback": [ "traceback": [
"\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[0;31mAttributeError\u001B[0m Traceback (most recent call last)", "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[0;32mIn[7], line 17\u001B[0m\n\u001B[1;32m 15\u001B[0m \u001B[38;5;66;03m#print(formatted_response)\u001B[39;00m\n\u001B[1;32m 16\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m p \u001B[38;5;129;01min\u001B[39;00m all_pucks_response:\n\u001B[0;32m---> 17\u001B[0m \u001B[38;5;28mprint\u001B[39m(p\u001B[38;5;241m.\u001B[39mpuck_name, \u001B[43mp\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msample_id\u001B[49m)\n\u001B[1;32m 19\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m ApiException \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[1;32m 20\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mException when calling PucksApi->get_all_pucks_in_tell: \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m e)\n", "Cell \u001B[0;32mIn[5], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[43maareDBclient\u001B[49m\u001B[38;5;241m.\u001B[39mApiClient(configuration) \u001B[38;5;28;01mas\u001B[39;00m api_client:\n\u001B[1;32m 2\u001B[0m \u001B[38;5;66;03m# Create an instance of the API class\u001B[39;00m\n\u001B[1;32m 3\u001B[0m api_instance \u001B[38;5;241m=\u001B[39m aareDBclient\u001B[38;5;241m.\u001B[39mPucksApi(api_client)\n\u001B[1;32m 5\u001B[0m \u001B[38;5;66;03m# GET request: Fetch all pucks in the tell\u001B[39;00m\n",
"File \u001B[0;32m/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pydantic/main.py:856\u001B[0m, in \u001B[0;36mBaseModel.__getattr__\u001B[0;34m(self, item)\u001B[0m\n\u001B[1;32m 853\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39m\u001B[38;5;21m__getattribute__\u001B[39m(item) \u001B[38;5;66;03m# Raises AttributeError if appropriate\u001B[39;00m\n\u001B[1;32m 854\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 855\u001B[0m \u001B[38;5;66;03m# this is the current error\u001B[39;00m\n\u001B[0;32m--> 856\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mAttributeError\u001B[39;00m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mtype\u001B[39m(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39m\u001B[38;5;18m__name__\u001B[39m\u001B[38;5;132;01m!r}\u001B[39;00m\u001B[38;5;124m object has no attribute \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mitem\u001B[38;5;132;01m!r}\u001B[39;00m\u001B[38;5;124m'\u001B[39m)\n", "\u001B[0;31mNameError\u001B[0m: name 'aareDBclient' is not defined"
"\u001B[0;31mAttributeError\u001B[0m: 'PuckWithTellPosition' object has no attribute 'sample_id'"
] ]
} }
], ],
"execution_count": 7 "execution_count": 5
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-09T19:41:14.264895Z", "end_time": "2025-01-16T19:45:44.042534Z",
"start_time": "2025-01-09T19:41:14.245643Z" "start_time": "2025-01-16T19:45:44.030292Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@ -256,30 +434,24 @@
"id": "ee8abb293096334a", "id": "ee8abb293096334a",
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "NameError",
"output_type": "stream", "evalue": "name 'aareDBclient' is not defined",
"text": [ "output_type": "error",
"The response of post_sample_event:\n", "traceback": [
"\n", "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
"SampleEventResponse(id=418, sample_id=261, event_type='Failed', timestamp=datetime.datetime(2025, 1, 9, 20, 41, 14))\n" "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)",
] "Cell \u001B[0;32mIn[6], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[43maareDBclient\u001B[49m\u001B[38;5;241m.\u001B[39mApiClient(configuration) \u001B[38;5;28;01mas\u001B[39;00m api_client:\n\u001B[1;32m 2\u001B[0m \u001B[38;5;66;03m# Create an instance of the Samples API class\u001B[39;00m\n\u001B[1;32m 3\u001B[0m api_instance \u001B[38;5;241m=\u001B[39m aareDBclient\u001B[38;5;241m.\u001B[39mSamplesApi(api_client)\n\u001B[1;32m 5\u001B[0m \u001B[38;5;66;03m# Define the sample ID and event payload using the expected model\u001B[39;00m\n",
}, "\u001B[0;31mNameError\u001B[0m: name 'aareDBclient' is not defined"
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n"
] ]
} }
], ],
"execution_count": 70 "execution_count": 6
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-01-10T11:43:57.303671Z", "end_time": "2025-01-16T19:45:46.332149Z",
"start_time": "2025-01-10T11:43:57.285551Z" "start_time": "2025-01-16T19:45:46.320963Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@ -301,24 +473,18 @@
"id": "6a808ee09f97ae13", "id": "6a808ee09f97ae13",
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "NameError",
"output_type": "stream", "evalue": "name 'aareDBclient' is not defined",
"text": [ "output_type": "error",
"The response of get_last_sample_event:\n", "traceback": [
"\n", "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
"SampleEventResponse(id=3, sample_id=14, event_type='Unmounted', timestamp=datetime.datetime(2025, 1, 10, 5, 53, 38))\n" "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)",
] "Cell \u001B[0;32mIn[7], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[43maareDBclient\u001B[49m\u001B[38;5;241m.\u001B[39mApiClient(configuration) \u001B[38;5;28;01mas\u001B[39;00m api_client:\n\u001B[1;32m 2\u001B[0m \u001B[38;5;66;03m# Create an instance of the Samples API class\u001B[39;00m\n\u001B[1;32m 3\u001B[0m api_instance \u001B[38;5;241m=\u001B[39m aareDBclient\u001B[38;5;241m.\u001B[39mSamplesApi(api_client)\n\u001B[1;32m 5\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 6\u001B[0m \u001B[38;5;66;03m# Get the last sample event\u001B[39;00m\n",
}, "\u001B[0;31mNameError\u001B[0m: name 'aareDBclient' is not defined"
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'mx-aare-test.psi.ch'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
" warnings.warn(\n"
] ]
} }
], ],
"execution_count": 11 "execution_count": 7
} }
], ],
"metadata": { "metadata": {