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
+4 -2
View File
@@ -173,7 +173,10 @@ function forgeResolveBoundRowCtx(gameData, attrs) {
var row = rows[0];
var ctx = {};
fieldsMetaForDef.forEach(function (f) {
var v = row[forgeFieldColumn(fieldsMetaForDef, f.name)];
// row[f.name] : gameData.data est déjà indexé par le nom D'AFFICHAGE
// du champ (voir full_game_payload.py), jamais par sa colonne SQL —
// voir filter-repeater-rows.js pour le détail de ce piège.
var v = row[f.name];
ctx[f.name] = (v === null || v === undefined || v === "") ? "" : String(v);
});
return ctx;
@@ -319,7 +322,6 @@ if (typeof module !== 'undefined' && module.exports) {
var filterMod = require('./filter-repeater-rows.js');
global.forgeResolveFilterValue = global.forgeResolveFilterValue || filterMod.forgeResolveFilterValue;
global.forgeResolveVariablePath = global.forgeResolveVariablePath || filterMod.forgeResolveVariablePath;
global.forgeFieldColumn = global.forgeFieldColumn || filterMod.forgeFieldColumn;
global.forgeDecodeClauses = global.forgeDecodeClauses || filterMod.forgeDecodeClauses;
global.forgeFilterRowsByClauses = global.forgeFilterRowsByClauses || filterMod.forgeFilterRowsByClauses;
global.compareValues = global.compareValues || require('../conditions.js').compareValues;