Fix distractor_words special=m2m in Directus via eigenen Endpoint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 20:25:09 +02:00
parent 434dbb2b4a
commit c2a2b0e6f7
2 changed files with 26 additions and 4 deletions

18
app.py
View File

@@ -1262,6 +1262,24 @@ def delete_word_item(w_id: str):
return jsonify({"error": "Delete failed"}), status
@app.route("/api/fix-distractor-field", methods=["POST"])
def fix_distractor_field():
"""Setzt special=m2m auf questions.distractor_words (einmalig)."""
token = request.headers.get("Authorization", "")
# Directus erfordert den vollen Payload beim Patchen von special
payload = {
"meta": {
"special": ["m2m"],
"interface": "list-m2m",
"options": {"template": "{{words_id.title_de}}"},
"hidden": False,
"note": "Ablenker-Wörter (thematisch passend, aber nicht die Antwort)",
}
}
data, status = _directus("PATCH", "/fields/questions/distractor_words", token, payload)
return jsonify({"ok": status in (200, 201), "status": status, "data": data})
@app.route("/api/setup-schema", methods=["POST"])
def setup_directus_schema():
"""

View File

@@ -323,10 +323,14 @@ export default function GenerateIt() {
title="Directus-Schema einmalig konfigurieren (M2M-Relationen)"
onClick={async () => {
if (!token) return
const res = await fetch('/api/setup-schema', { method: 'POST', headers: { Authorization: `Bearer ${token}` } })
const d = await res.json()
alert(`Setup: ${d.total} Schritte, ${d.failed} Fehler.\nSiehe Konsole für Details.`)
console.log('[setup-schema]', d)
const h = { Authorization: `Bearer ${token}` }
const [r1, r2] = await Promise.all([
fetch('/api/setup-schema', { method: 'POST', headers: h }),
fetch('/api/fix-distractor-field', { method: 'POST', headers: h }),
])
const [d1, d2] = await Promise.all([r1.json(), r2.json()])
alert(`Setup: ${d1.total} Schritte, ${d1.failed} Fehler\nDistractor-Fix: ${d2.ok ? 'OK' : 'Fehler'}`)
console.log('[setup-schema]', d1, '[fix-distractor]', d2)
}}
>
Schema