feat: edit and delete pairs in GenerateIt
- Backend: PATCH /api/directus/db-pairs/<id> updates level, statement, question (creates question if new, removes if cleared) - Backend: DELETE /api/directus/db-pairs/<id> removes pair + all junctions, questions and statements - Frontend: inline edit form per pair (level slider, statement, question) - Frontend: delete button per pair with confirm dialog - api.ts: updateDbPair, deleteDbPair Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
82
app.py
82
app.py
@@ -1877,6 +1877,88 @@ def directus_db_object_pairs(obj_id):
|
||||
return jsonify({"ok": True, "pair_id": pair_id, "statement_id": stmt_id, "question_id": q_id})
|
||||
|
||||
|
||||
@app.route("/api/directus/db-pairs/<pair_id>", methods=["PATCH", "DELETE"])
|
||||
def directus_db_pair(pair_id):
|
||||
"""PATCH: level + question/statement inline aktualisieren.
|
||||
DELETE: Pair + alle verknüpften Junctions + Question + Statement entfernen."""
|
||||
token = request.headers.get("Authorization", "")
|
||||
|
||||
if request.method == "PATCH":
|
||||
body = request.get_json(force=True, silent=True) or {}
|
||||
|
||||
# Pair-Level updaten
|
||||
if "level" in body:
|
||||
_directus("PATCH", f"/items/db_pairs/{pair_id}", token, {"level": body["level"]})
|
||||
|
||||
# Statement updaten (nur erstes verknüpftes)
|
||||
if "statement_de" in body:
|
||||
s_junc, _ = _directus("GET",
|
||||
f"/items/db_pairs_db_statement?filter[db_pairs_id][_eq]={pair_id}&fields=db_statement_id&limit=1", token)
|
||||
for e in (s_junc.get("data") or []):
|
||||
sid = e.get("db_statement_id")
|
||||
if sid:
|
||||
_directus("PATCH", f"/items/db_statement/{sid}", token,
|
||||
{"statement_de": body["statement_de"], "level": body.get("level", 50)})
|
||||
|
||||
# Question updaten/anlegen
|
||||
if "question_de" in body:
|
||||
question_de = (body["question_de"] or "").strip()
|
||||
q_junc, _ = _directus("GET",
|
||||
f"/items/db_pairs_db_question?filter[db_pairs_id][_eq]={pair_id}&fields=db_question_id&limit=1", token)
|
||||
existing_q = (q_junc.get("data") or [])
|
||||
if existing_q:
|
||||
qid = existing_q[0].get("db_question_id")
|
||||
if question_de:
|
||||
_directus("PATCH", f"/items/db_question/{qid}", token,
|
||||
{"question_de": question_de, "level": body.get("level", 50)})
|
||||
else:
|
||||
# Frage gelöscht → Junction + Item entfernen
|
||||
_directus("DELETE", f"/items/db_pairs_db_question", token,
|
||||
[e["id"] for e in existing_q if e.get("id")])
|
||||
_directus("DELETE", f"/items/db_question/{qid}", token)
|
||||
elif question_de:
|
||||
# Neue Frage anlegen und verknüpfen
|
||||
q_resp, s = _directus("POST", "/items/db_question", token,
|
||||
{"status": "draft", "question_de": question_de,
|
||||
"level": body.get("level", 50)})
|
||||
if s in (200, 201):
|
||||
qid = q_resp["data"]["id"]
|
||||
_directus("POST", "/items/db_pairs_db_question", token,
|
||||
{"db_pairs_id": pair_id, "db_question_id": qid})
|
||||
|
||||
return jsonify({"ok": True})
|
||||
|
||||
else: # DELETE
|
||||
# Junction zu Objekten entfernen
|
||||
obj_junc, _ = _directus("GET",
|
||||
f"/items/db_objects_db_pairs?filter[db_pairs_id][_eq]={pair_id}&fields=id&limit=100", token)
|
||||
obj_junc_ids = [e["id"] for e in (obj_junc.get("data") or []) if e.get("id")]
|
||||
if obj_junc_ids:
|
||||
_directus("DELETE", "/items/db_objects_db_pairs", token, obj_junc_ids)
|
||||
|
||||
# Questions löschen
|
||||
q_junc, _ = _directus("GET",
|
||||
f"/items/db_pairs_db_question?filter[db_pairs_id][_eq]={pair_id}&fields=id,db_question_id&limit=100", token)
|
||||
for e in (q_junc.get("data") or []):
|
||||
if e.get("id"):
|
||||
_directus("DELETE", f"/items/db_pairs_db_question/{e['id']}", token)
|
||||
if e.get("db_question_id"):
|
||||
_directus("DELETE", f"/items/db_question/{e['db_question_id']}", token)
|
||||
|
||||
# Statements löschen
|
||||
s_junc, _ = _directus("GET",
|
||||
f"/items/db_pairs_db_statement?filter[db_pairs_id][_eq]={pair_id}&fields=id,db_statement_id&limit=100", token)
|
||||
for e in (s_junc.get("data") or []):
|
||||
if e.get("id"):
|
||||
_directus("DELETE", f"/items/db_pairs_db_statement/{e['id']}", token)
|
||||
if e.get("db_statement_id"):
|
||||
_directus("DELETE", f"/items/db_statement/{e['db_statement_id']}", token)
|
||||
|
||||
# Pair selbst löschen
|
||||
_, s = _directus("DELETE", f"/items/db_pairs/{pair_id}", token)
|
||||
return jsonify({"ok": s in (200, 204)})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=8000, debug=True)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user