Projet

Général

Profil

Bug #49948

Les liste à choix multiple sont interprétés comme des chaînes dans les gabarits utilisé dans les paramètres des appels webservices

Ajouté par Nicolas Roche il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
07 janvier 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Les {{ xxx_raw }} d'une liste à choix multiple semblent retourner une chaine '[xxx]' plutôt qu'une liste ['xxx'] (contrairement à ce que remonte l’inspecteur)

Sur un appel webservice, je décompose les élément d'une liste à choix multiple en une chaîne séparée par des caractères ':', avec par exemple ce gabarit : {{ form_var_adultes_raw | join:":" }}

En utilisant ce gabarit dans l'inspecteur j'ai bien la chaîne attendue :

435929:439240

Mais si je vais voir les logs dans passerelle :
exception individusConcernes: "[:':4:3:5:9:2:9:':,: :':4:3:9:2:4:0:':]:\ue001..." does not match '^[0-9 :]+$'

Localement, j'ai rejoué une demande qui était passée auparavant. J'en déduis qu'il s'agit d'une régression.
(mais sinon, peut-être que je devrais simplement utiliser la virgule comme séparateur dans le connecteur ?)


Fichiers


Demandes liées

Lié à w.c.s. - Development #49970: {% with versus données complexesFermé08 janvier 2021

Actions
Lié à w.c.s. - Development #49971: {% for versus données complexesFermé08 janvier 2021

Actions

Révisions associées

Révision f356a182 (diff)
Ajouté par Frédéric Péters il y a plus de 3 ans

misc: revamp template complex data handling to monkeypatch last step (#49948)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 3 ans

\ue001 montre qu'il y a une espèce de n'importe quoi autour des données complexes.

Mais tous les liens mis à part, ton ticket, c'est un appel webservice, avec {{ form_var_adultes_raw | join:":" }} comme paramètre, et un résultat où tu voudrais "A:B:C" mais où tu reçois autre chose (un peu confus dans ma lecture de ton deuxième bloc de code.

#2

Mis à jour par Thomas Noël il y a plus de 3 ans

Oui, on a un form_var_truc_raw qui est une liste [1,2].

Mais quand on fait un {{ form_var_truc_raw|join:":" }} c'est comme si c'est liste était déjà transformée en string car on obtient :[:1:,:2:]:

#3

Mis à jour par Frédéric Péters il y a plus de 3 ans

Si vous voulez,

--- a/tests/test_workflows.py
+++ b/tests/test_workflows.py
@@ -2244,6 +2244,7 @@ def test_webservice_with_complex_data(http_requests, pub):
         'ezt_item_raw': '[form_var_item_raw]',
         'items_raw': '{{ form_var_items_raw }}',
         'ezt_items_raw': '[form_var_items_raw]',
+        'joined_item_raw': '{{ form_var_item_raw|join:"|" }}',
     }
     pub.substitutions.feed(formdata)
     with get_publisher().complex_data():
@@ -2260,6 +2261,7 @@ def test_webservice_with_complex_data(http_requests, pub):
         'ezt_item_raw': 'a',
         'items_raw': ['a', 'b'],
         'ezt_items_raw': ['a', 'b'],
+        'joined_item_raw': 'a|b',
     }

sinon je regarde demain.

#4

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Assigné à mis à Frédéric Péters
#5

Mis à jour par Frédéric Péters il y a plus de 3 ans

Obligé de passer par monkeypatcher le traitement des filtres et ça me révèle qu'il pourrait y avoir d'autres affaires du même genre (pas testé mais je pense à des trucs autour de {% with }, ou { for %}, même); là où on active les données complexes on doit rester sur des gabarits simples, donc ça doit en pratique aller.

#6

Mis à jour par Nicolas Roche il y a plus de 3 ans

Je valide d'un point de vue fonctionnel : le patch fonctionne bien dans mon cas d'usage
(par contre je ne saurais pas donner mon avis sur le patch).

#7

Mis à jour par Thomas Noël il y a plus de 3 ans

Aïe.

Frédéric Péters a écrit :

là où on active les données complexes on doit rester sur des gabarits simples, donc ça doit en pratique aller.

Si « for » ne marche pas, ça me parait très délicat. Je ne vois pas trop comment expliquer aux gens de ne pas l'utiliser, sachant que ceux qui configurent les appels webservices ou les attributions de données de traitement connaissent for voire with.

Et c'est confirmé que ça ne passe pas :

--- a/tests/test_workflows.py
+++ b/tests/test_workflows.py
@@ -2214,6 +2214,7 @@ def test_webservice_with_complex_data(http_requests, pub):
         'items_raw': '{{ form_var_items_raw }}',
         'ezt_items_raw': '[form_var_items_raw]',
         'joined_items_raw': '{{ form_var_items_raw|join:"|" }}',
+        'for_items_raw': '{% for item in form_var_items_raw %}{{item}}-{% endfor %}',
     }
     pub.substitutions.feed(formdata)
     with get_publisher().complex_data():
@@ -2231,6 +2232,7 @@ def test_webservice_with_complex_data(http_requests, pub):
         'items_raw': ['a', 'b'],
         'ezt_items_raw': ['a', 'b'],
         'joined_items_raw': 'a|b',
+        'for_items_raw': 'a-b-',
     }

se termine en :

E         Differing items:
E         {'for_items_raw': "[-'-a-'-,- -'-b-'-]-\ue00b-"} != {'for_items_raw': 'a-b-'}
#8

Mis à jour par Frédéric Péters il y a plus de 3 ans

Ça peut être un autre ticket ? Pendant ce temps je fais l'inventaire de la prod pour voir.

#9

Mis à jour par Frédéric Péters il y a plus de 3 ans

#10

Mis à jour par Frédéric Péters il y a plus de 3 ans

#11

Mis à jour par Frédéric Péters il y a plus de 3 ans

Voilà deux autres tickets puisque l'un se trouve présent en prod et l'autre pas.

#12

Mis à jour par Frédéric Péters il y a plus de 3 ans

J'étais content à ne pas avoir du monkey-patcher le système de templates de Django pour faire la gestion des données complexes mais se révèle donc que ça ne va pas tenir; plutôt que raccrocher les bouts, le patch attaché reprend du début pour changer l'approche : garder les données structurées tout du long et laisser la conversion avec ajout marqueur à la toute fin, ce qui signifie patcher uniquement le render_value_in_context de django.

Ça marche ainsi dans le patch attaché, où on peut donc voir :

  • le monkey-patch sur django.template.base.render_value_in_context
  • la suppression de la partie str_value de cache_complex_data, qui servait pour le cas particulier des blocs de champs (où {{ form_var_le_bloc }} pouvait à la fois être la donnée complexe, ou la représentation "digest_template" du bloc).
  • la modification à get_cached_complex_data pour gérer les variables lazy
  • la suppression dans wcs/variables.py de tout ce qui avait été ajouté pour la gestion des données complexes
  • des tests avec des {% for et des {% with
  • la modification du résultat du test ezt, qui ne gère plus les données complexes ('ezt_items_raw': repr(['a', 'b'])) (vu que ça ne se passe plus au niveau des variables mais au niveau du rendu final django, ça ne s'applique plus automatiquement à l'ezt).
  • comme donc l'ezt est ignoré, la partie nettoyage qui avait été ajoutée dans #49679 peut également être retirée.

À part le test ezt mentionné ci-dessus, tous les autres tests fonctionnent, donc pour moi c'est assez sûr comme changement.

#13

Mis à jour par Thomas Noël il y a plus de 3 ans

Quelque part, au final, c'est plus clair ainsi.

#14

Mis à jour par Thomas Noël il y a plus de 3 ans

  • Statut changé de Solution proposée à Solution validée
#15

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)

Oui, au final c'est mieux ainsi,

commit f356a18261895597a438be06dcc725a5267a2f83
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Thu Jan 7 23:18:47 2021 +0100

    misc: revamp template complex data handling to monkeypatch last step (#49948)
#16

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF