now with the heidi v1 spreadsheet validator

This commit is contained in:
GotthardG
2024-11-05 23:13:36 +01:00
parent 376352672f
commit 91468da9ed
7 changed files with 195 additions and 229 deletions

View File

@ -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)}")

View File

@ -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