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)}")
|
@ -1,35 +0,0 @@
|
||||
# app/routers/upload.py
|
||||
|
||||
from fastapi import APIRouter, UploadFile, File, HTTPException
|
||||
import os
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.post("/upload")
|
||||
async def upload_file(file: UploadFile = File(...)):
|
||||
if not file.filename.endswith('.xlsx'):
|
||||
raise HTTPException(status_code=400, detail="Invalid file format. Please upload an .xlsx file.")
|
||||
|
||||
save_path = os.path.join("uploads", file.filename)
|
||||
os.makedirs(os.path.dirname(save_path), exist_ok=True)
|
||||
with open(save_path, "wb") as buffer:
|
||||
buffer.write(await file.read())
|
||||
|
||||
# Validate the file (add your validation logic here)
|
||||
is_valid, summary, error = validate_file(save_path)
|
||||
if not is_valid:
|
||||
raise HTTPException(status_code=400, detail=error)
|
||||
|
||||
return summary
|
||||
|
||||
|
||||
def validate_file(file_path: str):
|
||||
# Implement your file validation logic here
|
||||
# For demo purpose, assuming it always succeeds
|
||||
summary = {
|
||||
"dewars": 5,
|
||||
"pucks": 10,
|
||||
"samples": 100,
|
||||
}
|
||||
return True, summary, None
|
Reference in New Issue
Block a user