Add event preview with two-step download flow

This commit is contained in:
2026-03-02 22:03:11 +01:00
parent f46763ace7
commit 9e5127a867
2 changed files with 317 additions and 15 deletions

View File

@@ -11,7 +11,7 @@ import os
import secrets
from fastapi import Depends, FastAPI, File, Form, HTTPException, Request, UploadFile, status
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.responses import FileResponse, HTMLResponse, JSONResponse
from fastapi.security import HTTPBasic, HTTPBasicCredentials
from fastapi.templating import Jinja2Templates
from starlette.background import BackgroundTask
@@ -55,6 +55,58 @@ def index(request: Request, _: None = Depends(require_auth)):
)
@app.post("/preview")
async def preview_pdf(
file: UploadFile = File(...),
_: None = Depends(require_auth),
):
filename = file.filename or "dienstplan.pdf"
if not filename.lower().endswith(".pdf"):
return JSONResponse(
{"error": "Bitte eine PDF-Datei hochladen."},
status_code=400,
)
data = await file.read()
if not data:
return JSONResponse(
{"error": "Die Datei ist leer."},
status_code=400,
)
with tempfile.TemporaryDirectory(prefix="pdf_to_ics_web_preview_") as temp_dir:
temp_dir_path = Path(temp_dir)
pdf_path = temp_dir_path / "upload.pdf"
pdf_path.write_bytes(data)
dienstplan = extract_dienstplan_data(str(pdf_path))
if not dienstplan.get("events"):
return JSONResponse(
{"error": "Keine Dienstplan-Events in der PDF gefunden."},
status_code=422,
)
events_preview = []
for event in dienstplan["events"]:
events_preview.append({
"date": event["date"].strftime("%d.%m.%Y") if event["date"] else "",
"service": event["service"] or "",
"time": f"{event['start_time']}-{event['end_time']}" if event["start_time"] and event["end_time"] else "",
})
return JSONResponse({
"success": True,
"filename": filename,
"metadata": {
"name": f"{dienstplan.get('vorname', '')} {dienstplan.get('name', '')}".strip(),
"personalnummer": dienstplan.get("personalnummer", ""),
"betriebshof": dienstplan.get("betriebshof", ""),
"count": len(dienstplan["events"]),
},
"events": events_preview,
})
@app.post("/convert")
async def convert_pdf(
request: Request,