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 = "" # LLM-Modell für diesen Job — leer = Worker-Default. Wird beim Erstellen # aus dem Upload-Form oder dem User-Default gefüllt; bleibt auch nach # Reprocess als Audit-Spur erhalten (mit dem aktuell gewählten Modell). model: str = "" step_started_at: Optional[datetime] = Field(default=None) last_heartbeat_at: Optional[datetime] = Field(default=None) created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))