From eed50aa942fb4a090ef502316d0f191da9d3cfee Mon Sep 17 00:00:00 2001 From: GotthardG <51994228+GotthardG@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:54:34 +0100 Subject: [PATCH] Added TELL spreadsheet template --- backend/app/routers/spreadsheet.py | 15 +++++++++++++++ backend/app/sample_models.py | 9 ++++++++- .../V7_TELLSamplesSpreadsheetTemplate.xlsx | Bin 0 -> 28674 bytes frontend/src/components/UploadDialog.tsx | 9 ++++----- 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 backend/downloads/V7_TELLSamplesSpreadsheetTemplate.xlsx diff --git a/backend/app/routers/spreadsheet.py b/backend/app/routers/spreadsheet.py index 65db3d3..0c2e9a3 100644 --- a/backend/app/routers/spreadsheet.py +++ b/backend/app/routers/spreadsheet.py @@ -1,11 +1,26 @@ from fastapi import APIRouter, UploadFile, File, HTTPException import logging from app.services.spreadsheet_service import SampleSpreadsheetImporter, SpreadsheetImportError +from fastapi.responses import FileResponse +import os router = APIRouter() logger = logging.getLogger(__name__) +@router.get("/download-template", response_class=FileResponse) +async def download_template(): + # Constructing the absolute path + current_dir = os.path.dirname(__file__) + 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="V7_TELLSamplesSpreadsheetTemplate.xlsx", + media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + + @router.post("/upload") async def upload_file(file: UploadFile = File(...)): try: diff --git a/backend/app/sample_models.py b/backend/app/sample_models.py index 32aa9e7..ffa5b1d 100644 --- a/backend/app/sample_models.py +++ b/backend/app/sample_models.py @@ -260,4 +260,11 @@ class SpreadsheetModel(BaseModel): return v class TELLModel(SpreadsheetModel): - pass # Extend the SpreadsheetModel with TELL-specific fields if needed \ No newline at end of file + input_order: int + samplemountcount: int = 0 + samplestatus: str = "not present" + puckaddress: str = "---" + username: str + puck_number: int + prefix: Optional[str] + folder: Optional[str] \ No newline at end of file diff --git a/backend/downloads/V7_TELLSamplesSpreadsheetTemplate.xlsx b/backend/downloads/V7_TELLSamplesSpreadsheetTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4bc600defc2cf9b0b91892fd661d7ae675ad05b8 GIT binary patch literal 28674 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 = ({ open, onClose }) => { dewars: string[]; pucks_count: number; pucks: string[]; - samples_count: number; - samples: string[]; + samples_count: string[]; } | null>(null); useEffect(() => { @@ -86,9 +85,9 @@ const UploadDialog: React.FC = ({ open, onClose }) => { Logo - Latest Spreadsheet Template Version 6 - Last update: October 18, 2024 - Latest Spreadsheet Instructions Version 2.3