from fastapi import APIRouter, File, UploadFile, Form, HTTPException from fastapi.responses import FileResponse from typing import Optional import os import shutil import tempfile import traceback from ..services.pdf_generator import generate_school_pdf router = APIRouter() @router.post("/generate-list") async def generate_list( institution: str = Form(...), date_info: str = Form(...), list_type: str = Form("k"), students_file: UploadFile = File(...), families_file: Optional[UploadFile] = File(None) ): try: with tempfile.TemporaryDirectory() as temp_dir: students_path = os.path.join(temp_dir, "students.csv") with open(students_path, "wb") as buffer: shutil.copyfileobj(students_file.file, buffer) families_path = None if families_file: families_path = os.path.join(temp_dir, "families.csv") with open(families_path, "wb") as buffer: shutil.copyfileobj(families_file.file, buffer) print(f"Generating PDF for: {institution}, Type: {list_type}") pdf_path = generate_school_pdf( institution=institution, date_info=date_info, list_type=list_type, students_csv_path=students_path, families_csv_path=families_path, output_dir=temp_dir ) if not pdf_path or not os.path.exists(pdf_path): raise HTTPException(status_code=500, detail="PDF generation failed - file not created.") with open(pdf_path, "rb") as f: pdf_bytes = f.read() final_output_path = os.path.join("/tmp", os.path.basename(pdf_path)) with open(final_output_path, "wb") as f: f.write(pdf_bytes) return FileResponse(path=final_output_path, filename=os.path.basename(pdf_path), media_type="application/pdf") except Exception as e: print("ERROR IN GENERATE LIST:") traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal Server Error: {str(e)}")