Projet

Général

Profil

Development #61080

ValueError sur |add quand on y passe des listes (traiter erreur de gabarit préremplissage / live)

Ajouté par Frédéric Péters il y a environ 2 ans. Mis à jour il y a environ 2 ans.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
25 janvier 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Exception:
  type = '<class 'ValueError'>', value = 'argument must be a sequence of length 3'

Stack trace (most recent call first):
  File "/usr/lib/python3/dist-packages/wcs/qommon/templatetags/qommon.py", line 247, in parse_decimal
   245         if do_raise:
   246             raise
>  247         return Decimal(0)
   248
   249

  locals:
     do_raise = True
     value = []

  File "/usr/lib/python3/dist-packages/wcs/qommon/templatetags/qommon.py", line 538, in add
   536         return parse_decimal(term1, do_raise=True) + parse_decimal(term2, do_raise=True)
   537     except (ArithmeticError, TypeError):
>  538         pass
   539
   540     # fallback to django add filter

  locals:
     term1 = []
     term2 = ['13', '26', '53', '54', '69']

Ça saute donc là-dessus et ça se termine en erreur 500; on est dans le calcul d'un préremplissage dans une vue de calcul "live" :

[...]
  File "/usr/lib/python3/dist-packages/wcs/fields.py", line 506, in get_prefill_value
   504                     exception=e,
   505                 )
>  506                 return ('', explicit_lock)
   507
   508         elif t == 'user' and user:

  locals:
     WorkflowStatusItem = <class 'wcs.workflows.WorkflowStatusItem'>
     explicit_lock = False
     force_string = False
     self = <ItemsField 2 "Je souhaite m'abonner aux alertes des communes suivantes :">
     t = 'string'
     user = None
     value = '{{ form_var_villeslv_raw|add:form_var_villespda_raw|add:form_var_villesno_raw }}'

  File "/usr/lib/python3/dist-packages/wcs/fields.py", line 2348, in get_prefill_value
  2346
  2347     def get_prefill_value(self, user=None, force_string=True):
> 2348         return super().get_prefill_value(user=user, force_string=False)
  2349
  2350     def convert_value_to_str(self, value):

  locals:
     __class__ = <class 'wcs.fields.ItemsField'>
     force_string = True
     self = <ItemsField 2 "Je souhaite m'abonner aux alertes des communes suivantes :">
     user = None

  File "/usr/lib/python3/dist-packages/wcs/forms/common.py", line 813, in live_process_fields
   811                 update_prefill = bool('prefilled_%s' % field.id in get_request().form)
   812                 if update_prefill:
>  813                     value = field.get_prefill_value()[0]
   814                     if field.key == 'bool':
   815                         value = field.convert_value_from_str(value)

[...]

REQUEST_URI     '/pn_gestion_preferences/live'

Il faudrait sans doute attraper l'erreur et la logguer et faire comme si on avait reçu une chaine vide en résultat.

A priori basiquement :

--- a/wcs/forms/common.py
+++ b/wcs/forms/common.py
@@ -810,7 +810,11 @@ class FormStatusPage(Directory, FormTemplateMixin):
                     continue
                 update_prefill = bool('prefilled_%s' % field.id in get_request().form)
                 if update_prefill:
-                    value = field.get_prefill_value()[0]
+                    try:
+                        value = field.get_prefill_value()[0]
+                    except Exception as e:
+                        record_error(...)
+                        value = ''
                     if field.key == 'bool':
                         value = field.convert_value_from_str(value)

Formats disponibles : Atom PDF