Einzeln ging es schon (X je Karte). Bei fuenf abgeschlossenen Projekt-Ketten und
18 fertigen Karten waren das aber ~18 Klicks — praktisch raeumt dann niemand auf,
und die drei relevanten Karten gehen in der Liste unter.
Neu:
POST /api/ideen/archivieren-alle {projekt?} -> services.archive_done()
Kopfzeile: "18 fertige wegraeumen" (alle, auch die in Ketten)
Je Projekt: "wegraeumen" neben "N fertig"
Sicherheitseigenschaft, bewusst im Dienst statt in der UI: archive_done fasst
AUSSCHLIESSLICH status=done an — laufende, haengende, wartende und in Ausarbeitung
befindliche Karten nie, auch nicht ohne Projekt-Filter. Ein Sammel-Knopf darf
niemals versehentlich Arbeit abraeumen. Der Dialog sagt ausserdem ehrlich, dass
nichts geloescht wird: es ist Hermes' Kanban-Archiv, die Karten bleiben lesbar.
Getestet ohne Nebenwirkung: Filter auf ein nicht existierendes Projekt liefert
archiviert=0, die 19 Karten der Queue bleiben unangetastet. Das echte Wegraeumen
ist ein User-Klick, kein Deploy-Schritt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,11 @@ class AntwortIn(BaseModel):
|
||||
antwort: str
|
||||
|
||||
|
||||
class ArchivAlleIn(BaseModel):
|
||||
# Leer = alle fertigen Karten der Queue; gesetzt = nur die dieses Projekts.
|
||||
projekt: str = ""
|
||||
|
||||
|
||||
@router.get("/ideen")
|
||||
def list_queue() -> dict:
|
||||
return ideen.list_queue()
|
||||
@@ -114,6 +119,15 @@ def archive(body: TaskIn) -> dict:
|
||||
return res
|
||||
|
||||
|
||||
@router.post("/ideen/archivieren-alle")
|
||||
def archive_alle(body: ArchivAlleIn) -> dict:
|
||||
"""Fertige Karten sammelweise wegräumen. Fasst ausschließlich `done` an."""
|
||||
res = ideen.archive_done(body.projekt)
|
||||
if not res.get("ok"):
|
||||
raise HTTPException(400, res.get("error", "Archivieren fehlgeschlagen."))
|
||||
return res
|
||||
|
||||
|
||||
@router.get("/ideen/{id}/log")
|
||||
def get_log(id: str) -> dict:
|
||||
return ideen.log_of(id)
|
||||
|
||||
@@ -509,6 +509,41 @@ def archive_task(task_id: str) -> dict:
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
def archive_done(projekt: str = "") -> dict:
|
||||
"""Alle FERTIGEN Karten wegräumen — optional nur die eines Projekts.
|
||||
|
||||
Sammel-Aufräumen (25.07.2026): Bei fünf abgeschlossenen Projekt-Ketten wären das
|
||||
sonst ~18 Einzelklicks. Wie beim Einzel-Archivieren wird nichts gelöscht — die
|
||||
Karten wandern ins Kanban-Archiv und bleiben dort lesbar.
|
||||
|
||||
‼️ Bewusst NUR `done`. Laufende, hängende, wartende und in Ausarbeitung befindliche
|
||||
Karten werden nie angefasst, auch nicht bei leerem `projekt`-Filter — ein Sammel-
|
||||
Knopf darf niemals versehentlich Arbeit abräumen.
|
||||
"""
|
||||
if not _available():
|
||||
return {"ok": False, "error": "Die Ideen-Queue lebt auf der Box."}
|
||||
q = list_queue()
|
||||
if not q.get("available"):
|
||||
return {"ok": False, "error": q.get("fehler") or "Queue nicht lesbar."}
|
||||
|
||||
ziel = [i for i in q.get("items", [])
|
||||
if i.get("status") == "done" and (not projekt or i.get("projekt") == projekt)]
|
||||
if not ziel:
|
||||
return {"ok": True, "archiviert": 0, "fehlgeschlagen": []}
|
||||
|
||||
ok, fehler = 0, []
|
||||
for item in ziel:
|
||||
r = archive_task(item.get("id", ""))
|
||||
if r.get("ok"):
|
||||
ok += 1
|
||||
else:
|
||||
# Die Items aus list_queue tragen "titel" (deutsch), nicht das rohe "title".
|
||||
fehler.append({"id": item.get("id"), "titel": _kurz(item.get("titel") or "", 60),
|
||||
"error": r.get("error", "")})
|
||||
_list_cache["ts"] = 0.0
|
||||
return {"ok": True, "archiviert": ok, "fehlgeschlagen": fehler}
|
||||
|
||||
|
||||
def ergebnis_of(task_id: str) -> dict:
|
||||
"""Das ERGEBNIS einer fertigen Aufgabe — die Abschluss-Zusammenfassung des Workers.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user