Fix: Archived Directus items als gelöscht behandeln

Directus archiviert Items beim Löschen (status=archived) statt hart zu löschen.
- Questions/Words-Query filtert archived heraus (filter[status][_neq]=archived)
- Purge-Endpoints behandeln archived items als nicht-existent → Junction-Zeilen werden entfernt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 20:47:48 +02:00
parent ae10e60897
commit 50d5377fb5

15
app.py
View File

@@ -1192,10 +1192,10 @@ def get_object_questions_list(obj_id: str):
if not q_ids: if not q_ids:
return jsonify({"data": []}) return jsonify({"data": []})
# Schritt 2: Fragen laden (inkl. short_answer_de) # Schritt 2: Fragen laden (inkl. short_answer_de) archivierte ausschließen
ids_param = urllib.parse.quote(",".join(q_ids), safe="") ids_param = urllib.parse.quote(",".join(q_ids), safe="")
q_data, _ = _directus("GET", q_data, _ = _directus("GET",
f"/items/questions?filter[id][_in]={ids_param}&fields=id,question_de,answer_de,short_answer_de,level,status&limit=200", token) f"/items/questions?filter[id][_in]={ids_param}&filter[status][_neq]=archived&fields=id,question_de,answer_de,short_answer_de,level,status&limit=200", token)
items = sorted(q_data.get("data") or [], key=lambda x: x.get("level") or 0) items = sorted(q_data.get("data") or [], key=lambda x: x.get("level") or 0)
# Schritt 3: Distractor-Wörter pro Frage (Bulk) # Schritt 3: Distractor-Wörter pro Frage (Bulk)
@@ -1237,7 +1237,7 @@ def get_object_words_list(obj_id: str):
return jsonify({"data": []}) return jsonify({"data": []})
ids_param = urllib.parse.quote(",".join(w_ids), safe="") ids_param = urllib.parse.quote(",".join(w_ids), safe="")
w_data, _ = _directus("GET", w_data, _ = _directus("GET",
f"/items/words?filter[id][_in]={ids_param}&fields=id,title_de,level,status&limit=2000", token) f"/items/words?filter[id][_in]={ids_param}&filter[status][_neq]=archived&fields=id,title_de,level,status&limit=2000", token)
items = sorted(w_data.get("data") or [], key=lambda x: x.get("title_de") or "") items = sorted(w_data.get("data") or [], key=lambda x: x.get("title_de") or "")
return jsonify({"data": items}) return jsonify({"data": items})
@@ -1296,8 +1296,9 @@ def purge_orphan_junctions(obj_id: str):
fk_val = row.get(fk_field) fk_val = row.get(fk_field)
if not fk_val: if not fk_val:
continue continue
item_data, s = _directus("GET", f"/items/{item_col}/{fk_val}?fields=id", token) item_data, s = _directus("GET", f"/items/{item_col}/{fk_val}?fields=id,status", token)
if s != 200 or not item_data.get("data"): item = item_data.get("data") or {}
if s != 200 or not item or item.get("status") == "archived":
_directus("DELETE", f"/items/{junc_col}/{row['id']}", token) _directus("DELETE", f"/items/{junc_col}/{row['id']}", token)
removed += 1 removed += 1
@@ -1326,10 +1327,10 @@ def purge_all_orphans():
if not fk_ids: if not fk_ids:
continue continue
# fetch which IDs still exist in one bulk call # fetch which IDs still exist AND are not archived
ids_param = ",".join(fk_ids) ids_param = ",".join(fk_ids)
existing_data, _ = _directus("GET", existing_data, _ = _directus("GET",
f"/items/{item_col}?filter[id][_in]={ids_param}&fields=id&limit=10000", token) f"/items/{item_col}?filter[id][_in]={ids_param}&filter[status][_neq]=archived&fields=id&limit=10000", token)
existing_ids = {e["id"] for e in (existing_data.get("data") or [])} existing_ids = {e["id"] for e in (existing_data.get("data") or [])}
orphan_junc_ids = [row["id"] for row in rows orphan_junc_ids = [row["id"] for row in rows