now with the heidi v1 spreadsheet validator
This commit is contained in:
@ -1,59 +1,51 @@
|
||||
# app/routers/spreadsheet.py
|
||||
# app/routes/spreadsheet.py
|
||||
|
||||
from fastapi import APIRouter, UploadFile, File, HTTPException
|
||||
from app.services.spreadsheet_service import SampleSpreadsheetImporter, SpreadsheetImportError
|
||||
import logging
|
||||
from app.services.spreadsheet_service import SampleSpreadsheetImporter, SpreadsheetImportError
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@router.post("/upload")
|
||||
async def upload_file(file: UploadFile = File(...)):
|
||||
importer = SampleSpreadsheetImporter()
|
||||
try:
|
||||
result = importer.import_spreadsheet(file)
|
||||
logger.info(f"Received file: {file.filename}")
|
||||
|
||||
if not result:
|
||||
logger.warning("No data extracted from spreadsheet.")
|
||||
return {
|
||||
"dewars_count": 0,
|
||||
"dewars": [],
|
||||
"pucks_count": 0,
|
||||
"pucks": [],
|
||||
"samples_count": 0,
|
||||
"samples": []
|
||||
}
|
||||
# File type check
|
||||
if not file.filename.endswith('.xlsx'):
|
||||
logger.error("Invalid file format")
|
||||
raise HTTPException(status_code=400, detail="Invalid file format. Please upload an .xlsx file.")
|
||||
|
||||
# Logging the raw results for debugging.
|
||||
logger.info(f"Extracted Result: {result}")
|
||||
# Reading file
|
||||
importer = SampleSpreadsheetImporter()
|
||||
validated_model = importer.import_spreadsheet(file)
|
||||
logger.info(f"Validated model: {validated_model}")
|
||||
|
||||
# Extract and respond with detailed information.
|
||||
dewars = list(set(sample['dewarname'] for sample in result))
|
||||
pucks = list(set(sample['puckname'] for sample in result))
|
||||
samples = list(set(sample['crystalname'] for sample in result))
|
||||
dewars = {sample['dewarname'] for sample in validated_model if 'dewarname' in sample}
|
||||
pucks = {sample['puckname'] for sample in validated_model if 'puckname' in sample}
|
||||
samples = {sample['crystalname'] for sample in validated_model if 'crystalname' in sample}
|
||||
|
||||
# Log the extracted names.
|
||||
logger.info(f"Dewars: {dewars}")
|
||||
logger.info(f"Pucks: {pucks}")
|
||||
logger.info(f"Samples: {samples}")
|
||||
# Logging the sets of names
|
||||
logger.info(f"Dewar Names: {dewars}")
|
||||
logger.info(f"Puck Names: {pucks}")
|
||||
logger.info(f"Sample Names: {samples}")
|
||||
|
||||
response_data = {
|
||||
# Forming structured response
|
||||
response = {
|
||||
"dewars_count": len(dewars),
|
||||
"dewars": dewars,
|
||||
"dewars": list(dewars),
|
||||
"pucks_count": len(pucks),
|
||||
"pucks": pucks,
|
||||
"pucks": list(pucks),
|
||||
"samples_count": len(samples),
|
||||
"samples": samples, # Ensure lists include detailed names
|
||||
"dewar_names": dewars, # Redundant but for clarity in the frontend
|
||||
"puck_names": pucks, # Redundant but for clarity in the frontend
|
||||
"crystal_names": samples # Redundant but for clarity in the frontend
|
||||
"samples": list(samples)
|
||||
}
|
||||
|
||||
# Log the final response for debugging.
|
||||
logger.info(f"Final response: {response_data}")
|
||||
|
||||
return response_data
|
||||
logger.info(f"Returning response: {response}")
|
||||
return response
|
||||
except SpreadsheetImportError as e:
|
||||
logger.error(f"Spreadsheet import error: {str(e)}")
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to process file: {str(e)}")
|
||||
raise HTTPException(status_code=400, detail="Failed to upload file. Please try again.")
|
||||
raise HTTPException(status_code=500, detail=f"Failed to upload file. Please try again. {str(e)}")
|
Reference in New Issue
Block a user