Fix formatting with black
This commit is contained in:
@ -1,7 +1,10 @@
|
||||
from app.sample_models import SpreadsheetModel, SpreadsheetResponse
|
||||
from fastapi import APIRouter, UploadFile, File, HTTPException
|
||||
import logging
|
||||
from app.services.spreadsheet_service import SampleSpreadsheetImporter, SpreadsheetImportError
|
||||
from app.services.spreadsheet_service import (
|
||||
SampleSpreadsheetImporter,
|
||||
SpreadsheetImportError,
|
||||
)
|
||||
from fastapi.responses import FileResponse
|
||||
import os
|
||||
from pydantic import ValidationError # Import ValidationError here
|
||||
@ -10,20 +13,27 @@ from app.row_storage import row_storage # Import the RowStorage instance
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
importer = SampleSpreadsheetImporter() # assuming this is a singleton or manageable instance
|
||||
importer = (
|
||||
SampleSpreadsheetImporter()
|
||||
) # assuming this is a singleton or manageable instance
|
||||
|
||||
|
||||
@router.get("/download-template", response_class=FileResponse)
|
||||
async def download_template():
|
||||
"""Serve a template file for spreadsheet upload."""
|
||||
current_dir = os.path.dirname(__file__)
|
||||
template_path = os.path.join(current_dir, "../../downloads/V7_TELLSamplesSpreadsheetTemplate.xlsx")
|
||||
template_path = os.path.join(
|
||||
current_dir, "../../downloads/V7_TELLSamplesSpreadsheetTemplate.xlsx"
|
||||
)
|
||||
|
||||
if not os.path.exists(template_path):
|
||||
raise HTTPException(status_code=404, detail="Template file not found.")
|
||||
|
||||
return FileResponse(template_path, filename="template.xlsx",
|
||||
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
return FileResponse(
|
||||
template_path,
|
||||
filename="template.xlsx",
|
||||
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
)
|
||||
|
||||
|
||||
@router.post("/upload", response_model=SpreadsheetResponse)
|
||||
@ -33,17 +43,24 @@ async def upload_file(file: UploadFile = File(...)):
|
||||
logger.info(f"Received file: {file.filename}")
|
||||
|
||||
# Validate file format
|
||||
if not file.filename.endswith('.xlsx'):
|
||||
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.")
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Invalid file format. Please upload an .xlsx file.",
|
||||
)
|
||||
|
||||
# Initialize the importer and process the spreadsheet
|
||||
validated_model, errors, raw_data, headers = importer.import_spreadsheet_with_errors(file)
|
||||
validated_model, errors, raw_data, headers = (
|
||||
importer.import_spreadsheet_with_errors(file)
|
||||
)
|
||||
|
||||
# Extract unique values for dewars, pucks, and samples
|
||||
dewars = {sample.dewarname for sample in validated_model if sample.dewarname}
|
||||
pucks = {sample.puckname for sample in validated_model if sample.puckname}
|
||||
samples = {sample.crystalname for sample in validated_model if sample.crystalname}
|
||||
samples = {
|
||||
sample.crystalname for sample in validated_model if sample.crystalname
|
||||
}
|
||||
|
||||
# Construct the response model with the processed data
|
||||
response_data = SpreadsheetResponse(
|
||||
@ -56,7 +73,7 @@ async def upload_file(file: UploadFile = File(...)):
|
||||
pucks=list(pucks),
|
||||
samples_count=len(samples),
|
||||
samples=list(samples),
|
||||
headers=headers # Include headers in the response
|
||||
headers=headers, # Include headers in the response
|
||||
)
|
||||
|
||||
# Store row data for future use
|
||||
@ -64,16 +81,23 @@ async def upload_file(file: UploadFile = File(...)):
|
||||
row_num = idx + 4 # Adjust row numbering if necessary
|
||||
row_storage.set_row(row_num, row.dict())
|
||||
|
||||
logger.info(f"Returning response with {len(validated_model)} records and {len(errors)} errors.")
|
||||
logger.info(
|
||||
f"Returning response with {len(validated_model)} records and {len(errors)} errors."
|
||||
)
|
||||
return response_data
|
||||
|
||||
except SpreadsheetImportError as e:
|
||||
logger.error(f"Spreadsheet import error: {str(e)}")
|
||||
raise HTTPException(status_code=400, detail=f"Error processing spreadsheet: {str(e)}")
|
||||
raise HTTPException(
|
||||
status_code=400, detail=f"Error processing spreadsheet: {str(e)}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error occurred: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail=f"Failed to upload file. Please try again. Error: {str(e)}")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to upload file. Please try again. Error: {str(e)}",
|
||||
)
|
||||
|
||||
|
||||
@router.post("/validate-cell")
|
||||
@ -86,7 +110,9 @@ async def validate_cell(data: dict):
|
||||
current_row_data = row_storage.get_row(row_num)
|
||||
|
||||
# Update the cell value
|
||||
current_row_data[col_name] = importer._clean_value(value, importer.get_expected_type(col_name))
|
||||
current_row_data[col_name] = importer._clean_value(
|
||||
value, importer.get_expected_type(col_name)
|
||||
)
|
||||
|
||||
# Temporarily store the updated row data
|
||||
row_storage.set_row(row_num, current_row_data)
|
||||
@ -100,6 +126,8 @@ async def validate_cell(data: dict):
|
||||
return {"is_valid": True, "message": ""}
|
||||
except ValidationError as e:
|
||||
# Extract the first error message
|
||||
message = e.errors()[0]['msg']
|
||||
logger.error(f"Validation failed for row {row_num}, column {col_name}: {message}")
|
||||
message = e.errors()[0]["msg"]
|
||||
logger.error(
|
||||
f"Validation failed for row {row_num}, column {col_name}: {message}"
|
||||
)
|
||||
return {"is_valid": False, "message": message}
|
||||
|
Reference in New Issue
Block a user