feat: Retry-Funktion + idempotente Pipeline (Transkript bleibt erhalten)

Backend:
- POST /api/jobs/{id}/retry — löscht summary/protocol/docx, queued den Job
  neu und startet Pipeline. Transkript bleibt erhalten (teurer Schritt).
- Pipeline überspringt Steps, deren Output-Datei schon existiert →
  retry rennt direkt in summarize ohne erneute Transkription.

Frontend:
- Kleiner gelber '↻ Erneut versuchen'-Button in jeder Job-Zeile/-Karte
  wenn Status != done
- Confirm-Dialog erklärt was passiert
- Event-Delegation, funktioniert für Tabelle (Desktop) und Cards (Mobile)
This commit is contained in:
root
2026-05-14 04:11:13 +00:00
parent 24ac3ac058
commit 220b7ccbc3
4 changed files with 148 additions and 26 deletions
+38
View File
@@ -90,6 +90,44 @@ def get_job(job_id: int, session: Session = Depends(get_session), user: User = D
return _job_dict(job, user)
@router.post("/{job_id}/retry")
async def retry_job(
job_id: int,
background: BackgroundTasks,
session: Session = Depends(get_session),
user: User = Depends(current_user),
):
"""Verarbeitung neu anstoßen.
Bereits vorhandenes Transkript wird beibehalten (teuerster Schritt),
Summary/Protokoll/DOCX werden gelöscht und neu erzeugt. Sinnvoll wenn
der Job bei summarize/protocol/docx hängt oder failed ist.
"""
job = _require_access(session.get(Job, job_id), user)
if job.status == JobStatus.DONE:
raise HTTPException(400, "Job ist bereits abgeschlossen")
# Post-Transkriptions-Artefakte löschen, damit sie neu erzeugt werden.
for attr in ("summary_path", "protocol_path", "docx_path"):
p = getattr(job, attr)
if p:
try:
Path(p).unlink(missing_ok=True)
except OSError:
pass
setattr(job, attr, "")
job.status = JobStatus.QUEUED
job.progress = 0
job.error = ""
session.add(job)
session.commit()
session.refresh(job)
background.add_task(run_pipeline, job.id)
return _job_dict(job, user)
@router.get("/{job_id}/download/{kind}")
def download(job_id: int, kind: str, session: Session = Depends(get_session), user: User = Depends(current_user)):
job = _require_access(session.get(Job, job_id), user)