Bug #39096
Bug évaluation sur condition python
0%
Description
Ticket d'origine :
J'ai l'impression d'avoir trouvé un bug dans l'évaluation d'une condition python.
- Demande : https://demarches-cnil.test.entrouvert.org/backoffice/management/soumettre-une-plainte-a-la-cnil/9/
- workflow (importé de celui sur lequel on travaille chez nous) : https://demarches-cnil.test.entrouvert.org/backoffice/workflows/23/*
- action posant pb : https://demarches-cnil.test.entrouvert.org/backoffice/workflows/23/status/new/items/1/
Le pb : la condition pyhton n'affiche le bouton de saut que si form_var_nb_complement est égal à 0. Dans le premier statut, j'ai mis "0" en valeur de cette variable, ce que l'inspecteur me confirme.
La condition :
> int( form_var_nb_complement ) == 0 >
L'erreur renvoyée :
TypeError: int() argument must be a string or a number, not 'NoneType'
l'inspecteur me confirme que form_var_nb_complement contient toujours "0" et le test d'expression de l'inspecteur me renvoie bien True sur exactement la même condition "int(form_var_nb_complement) == 0"
Nouveau wf : https://demarches-cnil.test.entrouvert.org/backoffice/workflows/24/
Formulaire pour tester : https://demarches-cnil.test.entrouvert.org/backoffice/forms/22/
Fichiers
Révisions associées
Historique
Mis à jour par Marie Kuntz il y a plus de 4 ans
- Sujet changé de Bug évaluation condition python ? à Bug évaluation sur condition python
Bug reproduit :
dans https://demarches-cnil.test.entrouvert.org/backoffice/management/mku-formulaire-pour-tester-wf/3/inspect
form_var_nb_complement vaut bien 0
Quand la même condition (j'ai copié-collé) est posée sur un saut automatique (par ex. https://demarches-cnil.test.entrouvert.org/backoffice/workflows/24/status/new/items/5/) elle fonctionne sans provoquer d'erreur.
Sur le saut manuel :
TypeError: int() argument must be a string or a number, not 'NoneType'
https://demarches-cnil.test.entrouvert.org/backoffice/workflows/24/logged-errors/20200120-101740-22-24-new-1-erreur-a-levaluation-de-la-condition-TypeError-int-argument-must-be-a-string-or-a-number-not-nonetype-/
Mis à jour par Marie Kuntz il y a plus de 4 ans
- Tracker changé de Project management à Development
- Projet changé de CNIL à w.c.s.
- Assigné à
Marie Kuntzsupprimé - Début
17 janvier 2020supprimé
Mis à jour par Frédéric Péters il y a plus de 4 ans
Tu peux reproduire ça sur une instance où il y aurait juste à cliquer sur un bouton pour constater le soucis ?
Mis à jour par Marie Kuntz il y a plus de 4 ans
Qu'est-ce qui ne convient pas avec cette instance ? (elle est chez nous)
Mis à jour par Frédéric Péters il y a plus de 4 ans
Sur https://demarches-cnil.test.entrouvert.org/backoffice/management/mku-formulaire-pour-tester-wf/3/ je n'ai pas de bouton.
Mis à jour par Marie Kuntz il y a plus de 4 ans
Je t'ai ajouté les rôles "agent SRP" (pour voir le bouton "demander des commentaires") et "debug Marie" (pour avoir les boutons de debug). J'ai remis la démarche au statut "A traiter"
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Avec le rôle "Agent SRP" je ne reproduis pas le bug en cliquant sur "Demande complément".
Mis à jour par Marie Kuntz il y a plus de 4 ans
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Marie Kuntz a écrit :
Le bug est visible ici :
https://demarches-cnil.test.entrouvert.org/backoffice/workflows/24/logged-errors/20200127-143011-22-24-new-1-erreur-a-levaluation-de-la-condition-TypeError-int-argument-must-be-a-string-a-bytes-like-object-or-a-number-not-nonetype-/
et non sur la demande traitée
Hmm ok je m'attendais à une trace à l'écran, le bug est bien là. Tu penses que tu pourrais simplifier le workflow un peu plus ?
Mis à jour par Marie Kuntz il y a plus de 4 ans
Je ne peux pas simplifier plus, là :D : https://demarches-cnil.test.entrouvert.org/backoffice/workflows/24/
Nouveau formulaire, simplifié lui aussi :
https://demarches-cnil.test.entrouvert.org/plaintes/mku-formulaire-simple-pour-tester-wf/
avec le listing : https://demarches-cnil.test.entrouvert.org/backoffice/management/mku-formulaire-simple-pour-tester-wf/
Mis à jour par Frédéric Péters il y a presque 4 ans
- Fichier 0001-misc-add-formdata-to-context-when-evaluation-roles-f.patch 0001-misc-add-formdata-to-context-when-evaluation-roles-f.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Enfin ramené en local pour regarder et ce qui se passe est très simple, c'est lors de l'affichage en barre latérale des autres demandes en cours de l'usager qu'il y a évaluation des droits d'actions pour déterminer s'il faut verrouiller ou pas les demandes, et cette évaluation se fait sans taper dans le contexte la demande en question.
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Dans FormData.get_action_roles() je vois déjà un :
with get_publisher().substitutions.temporary_feed(self): if not item.check_condition(self): continue
comment se fait-il qu'il en faille un de plus ?
Mis à jour par Frédéric Péters il y a plus de 3 ans
Je ne sais pas pourquoi tu parles de get_action_roles(), cette méthode n'est pas appelée dans cette vue, cette vue concerne la barre latérale, où il y a évaluation des différentes demandes exposées, pour voir si elles doivent être "verrouillée" ou pas.
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Ben j'ai cherché ce qui pouvait demander l'évaluation d'une expression et donc un temporary_feed à cet endroit :
with get_publisher().substitutions.temporary_feed(user_formdata): if user_roles.intersection(user_formdata.actions_roles): <- ici accès à FormData.actions_roles session.mark_visited_object(user_formdata)
et j'ai trouvé ça dans
class FormData
:def get_actions_roles(self): if self.is_draft(): return [] wf_status = self.get_status() if not wf_status: return [] from wcs.workflows import get_role_translation status_action_roles = set() for item in wf_status.items or []: if not hasattr(item, 'by') or not item.by: continue with get_publisher().substitutions.temporary_feed(self): if not item.check_condition(self): <-- ICI continue for role in item.by: if role == '_submitter': status_action_roles.add(role) else: real_role = get_role_translation(self, role) if real_role: status_action_roles.add(real_role) return status_action_roles actions_roles = property(get_actions_roles)
j'ai pensé qu'il y avait un rapport. Mais sinon je ne vois pas à quoi sert le temporary_feed(), il me manque une information.
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Statut changé de Solution proposée à En cours
- Patch proposed changé de Oui à Non
En effet j'ai du avoir autre chose qui intervenait dans les tests à ce moment, je reprends.
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Fichier 0001-misc-don-t-record-errors-when-evaluating-roles-for-p.patch 0001-misc-don-t-record-errors-when-evaluating-roles-for-p.patch ajouté
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
Ce qui se passe, mieux analysé, c'est que la liste related_user_forms en contexte SQL est chargée sous forme de sql.AnyFormData, du coup dedans pas les données du coup lors de l'évaluation en barre latérale s'il y a une condition qui dépend ainsi d'une données, erreur.
Option donc prise dans le patch attaché de ne pas enregistrer de tels moments. (plutôt qu'alourdir cette vue en chargeant pour de vrai toutes les données).
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Si le patch s'applique toujours. Mais j'ai fini par comprendre que le souci ici est une erreur loggé qui n'en est pas vraiment une, fonctionnellement il n'y a sinon pas de problème mais j'aurai plutôt vu le fait de ne pas calculer des choses qui n'ont pas d'intérêt dans la situation, i.e. en barre latérale ne pas calculer action rôle avec les conditions si ça n'est pas possible, plutôt que d'en cacher les erreurs.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
Après rebase + black,
commit e6eead49b45aabef6a4d3394b516f19185ccf072 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Mon Aug 3 17:18:36 2020 +0200 misc: don't record errors when evaluating roles for pending bar (#39096)
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
misc: don't record errors when evaluating roles for pending bar (#39096)