Export Web/SCORM : corrige la résolution des champs "relation" hors ligne
Build and deploy / test-python (push) Successful in 6m55s
Build and deploy / test-js (push) Successful in 1m4s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Bug signalé : une Donnée liée/un filtre référençant un champ "relation"
affichait "{{champ}}" tel quel une fois exporté, alors qu'il fonctionnait
en ligne. Deux causes cumulées :

- full_game_payload.py lisait la colonne SQL "<champ>" au lieu de
  "<champ>_id" (seule vraie colonne d'un champ relation, voir
  _field_column dans filter_repeater_rows.py) en construisant
  gameData.data — une valeur toujours None. Invisible en ligne (les
  filtres y requêtent la base fraîche, jamais cette snapshot), mais
  fatal hors ligne (aucune base à requêter).
- Une fois ce None corrigé, le port JS (forgeFieldColumn) relisait
  cette même valeur sous une clé slugifiée+suffixée ("boss_id") alors
  que gameData.data est déjà indexé par le nom D'AFFICHAGE du champ
  ("boss") — mismatch qui ne se voyait que sur un champ relation (le
  seul cas où slugify(nom)+suffixe diverge du nom original). Supprime
  ce port erroné, lit directement row[fieldName] partout.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-02 10:02:26 +02:00
co-authored by Claude Sonnet 5
parent 7bc4c89eaa
commit e08c53e042
7 changed files with 138 additions and 44 deletions
+17 -1
View File
@@ -96,7 +96,23 @@ def full_game_payload(slug, player_id=db.PLAYER_SHARED):
for d in definitions:
full = db.get_definition(slug, d["id"])
rows = db.list_rows(slug, full, player_id)
cols = {f["name"]: db.slugify(f["name"]).replace("-", "_") for f in full["fields"]}
# Un champ "relation" vit dans une colonne SQL "<champ>_id", jamais
# sous son nom "propre" (voir _field_column dans
# filter_repeater_rows.py, la même règle) — sans ce cas particulier,
# un champ relation lisait toujours une colonne inexistante et
# renvoyait systématiquement None ici. Inoffensif EN LIGNE (cette
# snapshot n'est jamais utilisée pour un filtre/une Donnée liée : ces
# derniers requêtent la base fraîche via filter_repeater_rows.py) —
# mais fatal pour le port hors ligne (export Web/SCORM), qui n'a
# QUE cette snapshot, aucune base à requêter (bug signalé par un
# utilisateur : un filtre sur un champ relation ne matchait jamais
# rien une fois exporté, laissant "{{champ}}" affiché tel quel).
cols = {}
for f in full["fields"]:
col = db.slugify(f["name"]).replace("-", "_")
if f["type"] == "relation":
col += "_id"
cols[f["name"]] = col
data[str(d["id"])] = [
{**{fname: r.get(col) for fname, col in cols.items()}, "id": r["id"]}
for r in rows