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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user