Development #59399
Erreur technique à la soumission d'un champ liste alimenté par une vue personnalisée dynamique
0%
Description
Mais seulement si le champ est dans une page.
Pour reproduire il suffit de prendre l'exemple de la doc, puis d'ajouter une page : on ne peut plus valider le formulaire et on se prend le message « Technical error, please try again ».
Ça vient d'une exception rattrapée dans
1094 try: 1095 data = self.form SetValueError(*args: object) ror=True) 1096 except SetValueError: 1097 return self.page( 1098 page, 1099 page_change=False, 1100 page_error_messages=[_('Technical error, please try again')], 1101 transient_formdata=transient_formdata, 1102 )
et si on fait du pdb pour voir l'exception effectivement levée on a la trace suivante :
File "/home/vdeniaud/src/wcs/wcs/forms/root.py", line 1096, in _q_index data = self.formdef.get_data(form, raise_on_error=True) File "/home/vdeniaud/src/wcs/wcs/formdef.py", line 868, in get_data d.update(self.get_field_data(field, widget, raise_on_error=raise_on_error)) File "/home/vdeniaud/src/wcs/wcs/formdef.py", line 858, in get_field_data field.set_value(d, d[field.id], raise_on_error=raise_on_error) File "/home/vdeniaud/src/wcs/wcs/fields.py", line 630, in set_value raise SetValueError('a datasource is unavailable') wcs.fields.SetValueError: a datasource is unavailable
Je joins une modif aux tests qui permet de reproduire.
Fichiers
Révisions associées
Historique
Mis à jour par Pierre Cros il y a plus de 2 ans
J'ai testé ici (j'ai reproduit l'histoire de vue dynamique + page) où j'ai l'erreur quand je suis pas connecté et je l'ai plus quand je suis connecté :
https://demarches-validation.test.entrouvert.org/pcros2/
Comme à Versailles j'ai l'erreur même en étant connecté, je me dis que c'est peut-être lié à un rôle de lecture/écriture sur la fiche ?
Mis à jour par Pierre Cros il y a plus de 2 ans
Pierre Cros a écrit :
Comme à Versailles j'ai l'erreur même en étant connecté, je me dis que c'est peut-être lié à un rôle de lecture/écriture sur la fiche ?
C'est pas ça j'ai testé sans avoir le rôle d'édition de la fiche et j'ai pas l'erreur
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Ce qui se passe (au moins dans le test je n'ai pas vérifié sur le formulaire du lien) c'est que la valeur soumise n'existe pas dans la vue filtrée :
(Pdb) CardDef.get_data_source_items('carddef:items', get_by_'3') [{'id': 3, 'text': 'attr2', 'item': 'baz', 'attr': 'attr2'}] (Pdb) CardDef.get_data_source_items('carddef:items:as-data-source', get_by_id='3') []
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Et donc il y avait déjà un bug ici, invisible parce qu'on est juste dans un bout de code qui est essaie d'évaluer les post_condition en fonction des nouvelles valeurs soumises (et parce qu'on ne vérifiait pas les échecs avant), le patch suivant fait passer le test :
diff --git a/wcs/forms/root.py b/wcs/forms/root.py index 70c4d3e0b..cecf81314 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -1092,7 +1092,8 @@ class FormPage(Directory, FormTemplateMixin): # variables. form_data = copy.copy(session.get_by_magictoken(magictoken, {})) try: - data = self.formdef.get_data(form, raise_on_error=True) + with get_publisher().substitutions.temporary_feed(transient_formdata, force_mode='lazy'): + data = self.formdef.get_data(form, raise_on_error=True) except SetValueError: return self.page( page,
Sans ça le template dans le filtre de la vue personnalisée dynamique n'est pas évalué correctement (vu qu'il dépend de la valeur qui vient d'être soumise sur la même page), un peu plus haut en plus de ça on fait un self.reset_locked_data()
dans une situation un peu analogue...
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-test.patch 0001-test.patch ajouté
- Fichier 0002-fix.patch 0002-fix.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Le test simplifié et le fix, à voir si ça casse ailleurs.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-forms-feed-transient_formdata-when-computing-field-v.patch 0001-forms-feed-transient_formdata-when-computing-field-v.patch ajouté
En espérant qu'on soit pas que 2 à comprendre le message de commit.
Mis à jour par Valentin Deniaud il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Allons-y comme ça
Mis à jour par Valentin Deniaud il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit f3960f227cd24f65a9c7f292a6450419d67b945b Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Dec 7 17:00:46 2021 +0100 forms: feed transient_formdata when computing field values for postconditions (#59399)
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
forms: feed transient_formdata when computing field values for postconditions (#59399)