Add event preview with two-step download flow
This commit is contained in:
54
web/app.py
54
web/app.py
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user