Corrige la comparaison booléenne : "Oui"/"Non" n'était pas reconnu comme valeur vraie/fausse

Bug remonté avec une "Mail card" (icône enveloppe fermée si is_opened
est à "Non", ouverte si "Oui") : les DEUX variantes s'affichaient (ou
aucune), selon la ligne.

Cause : _compare() (filter_repeater_rows.py, utilisé par la condition de
visibilité, le Répéteur et Donnée liée) ne reconnaissait "1"/"true"/"vrai"
comme valeur vraie pour un champ booléen — jamais "oui", pourtant le SEUL
vocabulaire que l'app affiche elle-même pour ce type de champ partout
ailleurs (voir data_list.html : "Oui" si vrai sinon "Non"). Une valeur de
comparaison fixe tapée "Oui" retombait donc silencieusement à "faux",
et comme l'opérateur et le champ étaient par ailleurs corrects, ça
donnait l'impression que la condition "ne voyait" rien : sur la ligne où
is_opened=faux, les DEUX cartes ("égal à Oui" et "égal à Non", toutes
deux évaluées comme "égal à faux") s'affichaient ensemble ; sur la ligne
où is_opened=vrai, aucune des deux.

Fix : "oui" ajouté à l'ensemble des valeurs reconnues comme vraies,
côté Python (_compare) ET côté JS (compareValues() dans play.html, qui
doit rester alignée — utilisée par les nœuds Condition de la Logique de
la scène), cette dernière au passage rendue insensible à la casse comme
son équivalent Python (elle ne l'était pas du tout).

Ajoute un test de régression dédié à ce cas précis.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-25 12:52:27 +02:00
co-authored by Claude Sonnet 5
parent a28cc5881e
commit baa3da1035
3 changed files with 50 additions and 2 deletions
+8 -1
View File
@@ -60,7 +60,14 @@ def _compare(actual, operator, expected, field_type):
else:
truthy = bool(actual)
a = 1 if truthy else 0
e = 1 if str(expected).strip().lower() in ("1", "true", "vrai") else 0
# "oui"/"non" est le vocabulaire affiché partout ailleurs dans
# l'app pour un champ booléen (voir data_list.html, "Oui" si vrai
# sinon "Non") — une valeur de comparaison fixe tapée "Oui" doit
# donc être reconnue comme vraie ici aussi, pas seulement "1"/
# "true"/"vrai" (sans quoi "Oui" retombait silencieusement à faux,
# et un widget conditionné sur "est égal à Oui" ne s'affichait
# jamais quand il aurait dû).
e = 1 if str(expected).strip().lower() in ("1", "true", "vrai", "oui") else 0
return a != e if operator == "different" else a == e
try:
an, en = float(actual), float(expected)