Development #6843
le signe == dans les expressions
0%
Description
Quand une expression est foo='bar' au lieu de foo=='bar', on a cette erreur:
Exception: type = '<type 'exceptions.SyntaxError'>', value = 'invalid syntax (<string>, line 1)' Stack trace (most recent call first): File "/usr/lib/python2.7/dist-packages/wcs/wf/jump.py", line 205, in must_jump 203 condition = self.condition 204 global_variables = get_publisher().get_global_eval_dict() > 205 get_publisher().notify_of_exception(sys.exc_info()) 206 must_jump = False 207 (...) condition = 'form_var_intervention="Circulation relative aux travaux"'
Dans un premier temps, je propose d'ajouter une note dans la doc pour attirer l'attention sur ce "==".
Fichiers
Demandes liées
Historique
Mis à jour par Thomas Noël il y a environ 9 ans
- Fichier 0001-help-note-about-in-expressions-6843.patch 0001-help-note-about-in-expressions-6843.patch ajouté
- Statut changé de Nouveau à En cours
- Assigné à mis à Thomas Noël
- Patch proposed changé de Non à Oui
Mis à jour par Thomas Noël il y a environ 9 ans
Je sais que la question a déjà été évoquée, je ne sais plus où on en était, mais j'imaginerais bien une fonction du genre:
def error_in_expression(expression): try: compile(expression, filename='<string>', mode='eval') except SyntaxError, e: return _('Erreur de syntaxe au caractère %s') % e.offset return None
qu'on pourrait appeler quand on affiche un form avec une expression, genre « if error_in_expression(condition): hint="il semble que cette expression comporte une erreur (%s)" % error_in_expression(condition) »
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
C'est une suite au ticket #1630 il me semble. À ce stade on pourrait même envisager un widget "Expression" qui centraliserait tout ça ? Pour l'instant je crois qu'on a simplement un widget 'Préremplissage' mais c'est un cas particulier du cas général "expression". L'autre source de warning qui serait utile ce serait de pouvoir signaler les variables qui nous semble ne pas exister, en analysant l'arbre de l'expression compilée par rapport aux variables de substitution disponibles. Il y aussi le fait de pouvoir filtrer les expressions dangereuses genre open('/etc/passwd').read()
ou range(1000000000000)
, la seule bonne façon de faire semble être de faire une whitelist.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
Je bouge ma note dans un nouveau ticket j'ai cru celui-ci plus large que ça.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
- Lié à Development #6844: Gestion des expressions ajouté
Mis à jour par Thomas Noël il y a environ 9 ans
- Fichier 0001-validate-condition-in-page-field-6843.patch 0001-validate-condition-in-page-field-6843.patch ajouté
Un exemple de l'idée de la note 2, i.e. juste validation de la syntaxe des expressions lors de leur saisie, et dans ce patch juste pour les conditions de page.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
- Fichier 0001-Add-EvalStringWidget-and-use-it-for-page-conditions.patch 0001-Add-EvalStringWidget-and-use-it-for-page-conditions.patch ajouté
Je voyais plus un truc comme ça.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
Et ensuite évoluer pour que le EvalStringWidget ne renvoie pas juste une chaîne mais un objet d'un type PythonExpression
(qui se pickle bien quand même), ayant une méthode eval()
et qui implémenterait toutes les siouxeries qu'on pourrait inventer dans le futur.
Mis à jour par Thomas Noël il y a environ 9 ans
Benjamin Dauvergne a écrit :
Je voyais plus un truc comme ça.
Yep, mieux.
compile() peu aussi faire du TypeError, on laisse passer ?
(et sinon, je suis tatasse, mais je trouve qu'utiliser ast.parse serait plus à propos ici)
Mis à jour par Frédéric Péters il y a environ 9 ans
Je pousserais dès maintenant l'idée vers un PythonConditionWidget (qui serait aussi à utiliser pour les conditions dans l'action de workflow "saut") et j'y ajouterais une lecture minimale du résultat de l'ast.parse, pour avertir en cas de _ast.Assign que c'est plutôt == que la personne veut (et ainsi totalement revenir à l'intitulé de ce ticket).
Mis à jour par Thomas Noël il y a presque 8 ans
- Lié à Development #11042: Avoir un widget validation les expressions calculées dans les workflows ajouté
Mis à jour par Thomas Noël il y a presque 8 ans
- Statut changé de En cours à Résolu (à déployer)
fait dans #11042
Mis à jour par Frédéric Péters il y a presque 8 ans
- Statut changé de Résolu (à déployer) à Nouveau
Je viens de mettre un a = 'b'
dans un champ "condition" de saut et ça n'a pas râlé du tout. D'ailleurs le champ condition est un StringWidget.
Mis à jour par Thomas Noël il y a presque 8 ans
Frédéric Péters a écrit :
Je viens de mettre un
a = 'b'
dans un champ "condition" de saut et ça n'a pas râlé du tout. D'ailleurs le champ condition est un StringWidget.
J'ai confondu les expression de conditions avec celles pour compute.
Mis à jour par Frédéric Péters il y a environ 6 ans
- Statut changé de Nouveau à Fermé
Celui-ci a concerné les expressions; pour l'évaluation des conditions il y a maintenant #22102.