From 50d5377fb51754f92888d5a43a179b4ec6ff4230 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 26 Apr 2026 20:47:48 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Archived=20Directus=20items=20als=20gel?= =?UTF-8?q?=C3=B6scht=20behandeln?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- app.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app.py b/app.py index 5213315..4ac4c0d 100644 --- a/app.py +++ b/app.py @@ -1192,10 +1192,10 @@ def get_object_questions_list(obj_id: str): if not q_ids: 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="") 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) # Schritt 3: Distractor-Wörter pro Frage (Bulk) @@ -1237,7 +1237,7 @@ def get_object_words_list(obj_id: str): return jsonify({"data": []}) ids_param = urllib.parse.quote(",".join(w_ids), safe="") 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 "") return jsonify({"data": items}) @@ -1296,8 +1296,9 @@ def purge_orphan_junctions(obj_id: str): fk_val = row.get(fk_field) if not fk_val: continue - item_data, s = _directus("GET", f"/items/{item_col}/{fk_val}?fields=id", token) - if s != 200 or not item_data.get("data"): + item_data, s = _directus("GET", f"/items/{item_col}/{fk_val}?fields=id,status", token) + 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) removed += 1 @@ -1326,10 +1327,10 @@ def purge_all_orphans(): if not fk_ids: continue - # fetch which IDs still exist in one bulk call + # fetch which IDs still exist AND are not archived ids_param = ",".join(fk_ids) 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 [])} orphan_junc_ids = [row["id"] for row in rows