60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# app/routers/spreadsheet.py
|
|
|
|
from fastapi import APIRouter, UploadFile, File, HTTPException
|
|
from app.services.spreadsheet_service import SampleSpreadsheetImporter, SpreadsheetImportError
|
|
import logging
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.post("/upload")
|
|
async def upload_file(file: UploadFile = File(...)):
|
|
importer = SampleSpreadsheetImporter()
|
|
try:
|
|
result = importer.import_spreadsheet(file)
|
|
|
|
if not result:
|
|
logger.warning("No data extracted from spreadsheet.")
|
|
return {
|
|
"dewars_count": 0,
|
|
"dewars": [],
|
|
"pucks_count": 0,
|
|
"pucks": [],
|
|
"samples_count": 0,
|
|
"samples": []
|
|
}
|
|
|
|
# Logging the raw results for debugging.
|
|
logger.info(f"Extracted Result: {result}")
|
|
|
|
# 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))
|
|
|
|
# Log the extracted names.
|
|
logger.info(f"Dewars: {dewars}")
|
|
logger.info(f"Pucks: {pucks}")
|
|
logger.info(f"Samples: {samples}")
|
|
|
|
response_data = {
|
|
"dewars_count": len(dewars),
|
|
"dewars": dewars,
|
|
"pucks_count": len(pucks),
|
|
"pucks": 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
|
|
}
|
|
|
|
# Log the final response for debugging.
|
|
logger.info(f"Final response: {response_data}")
|
|
|
|
return response_data
|
|
except SpreadsheetImportError as e:
|
|
logger.error(f"Failed to process file: {str(e)}")
|
|
raise HTTPException(status_code=400, detail="Failed to upload file. Please try again.")
|