root 354e4c57eb feat: PDF-Export zusätzlich zu DOCX
Mac-Worker:
- pdf_export.py mit reportlab (pure Python, kein externes Tool)
- Nutzt dieselbe profile.docx-Konfig wie der DOCX-Renderer →
  strukturell identisch, nur andere Optik
- POST /api/export/pdf
- requirements: reportlab==4.2.5

LXC:
- Job.pdf_path neu (Migration: ALTER TABLE job ADD COLUMN)
- Pipeline-Step nach DOCX: PDF wird ebenfalls erzeugt
  (Progress: 90 DOCX → 95 PDF → 100 done)
- /api/jobs/{id}/download/pdf
- /api/jobs/{id}/retry löscht PDF mit, damit es neu erzeugt wird
- Frontend: zusätzlicher Download-Button "PDF" (vorne im Array)
- Tabelle: Download-Spalte 320px, 3-spaltiges Grid (5 Buttons → 3+2)
- Cards (Mobile) bleiben 2-spaltig (5 Buttons → 3 Zeilen)
2026-05-14 04:48:47 +00:00

33 lines
980 B
Python

from datetime import datetime, timezone
from typing import Optional
from sqlmodel import SQLModel, Field
class JobStatus:
QUEUED = "queued"
TRANSCRIBING = "transcribing"
SUMMARIZING = "summarizing"
PROTOCOLLING = "protocolling"
EXPORTING = "exporting"
DONE = "done"
FAILED = "failed"
class Job(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
owner_id: Optional[int] = Field(default=None, foreign_key="user.id", index=True)
profile: str = Field(default="meeting")
filename: str
original_name: str
title: str = ""
status: str = JobStatus.QUEUED
progress: int = 0
error: str = ""
transcript_path: str = ""
summary_path: str = ""
protocol_path: str = ""
docx_path: str = ""
pdf_path: str = ""
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))