Projet

Général

Profil

Development #59399

Erreur technique à la soumission d'un champ liste alimenté par une vue personnalisée dynamique

Ajouté par Valentin Deniaud il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

0001-wip.patch (2,69 ko) 0001-wip.patch Valentin Deniaud, 07 décembre 2021 13:58
0001-test.patch (1,6 ko) 0001-test.patch Benjamin Dauvergne, 07 décembre 2021 15:57
0002-fix.patch (992 octets) 0002-fix.patch Benjamin Dauvergne, 07 décembre 2021 15:57
0001-forms-feed-transient_formdata-when-computing-field-v.patch (2,41 ko) 0001-forms-feed-transient_formdata-when-computing-field-v.patch Benjamin Dauvergne, 07 décembre 2021 16:37

Révisions associées

Révision f3960f22 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 2 ans

forms: feed transient_formdata when computing field values for postconditions (#59399)

Historique

#2

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 ?

#3

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

#4

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Je regarde, ça vient de (#56824).

#5

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')
[]

#6

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...

#7

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Assigné à mis à Benjamin Dauvergne
#8

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Le test simplifié et le fix, à voir si ça casse ailleurs.

#10

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

En espérant qu'on soit pas que 2 à comprendre le message de commit.

#11

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

#12

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)
#13

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
#14

Mis à jour par Transition automatique il y a environ 2 ans

Automatic expiration

Formats disponibles : Atom PDF