Development #42062
permettre les manipulation de chaine avec |add
0%
Description
On en parlait côté Combo mais voilà via #42029 que le besoin est également exprimé pour w.c.s.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Thomas Noël il y a environ 4 ans
Ah zut.
La logique actuelle dans Combo est : « on tente de faire une addition si le membre de gauche est un décimal ou est convertible en décimal, sinon on fait le add de Django »
Le risque est de faire planter les usages actuels de add sur une variable non existante ou égale à None (des choses comme {{ form_var_nb_mails_envoyes_Stat_raw|add:"1" }}
sur Chambéry)
J'ai envie de conserver la magie et de ne pas imposer le "|decimal|add".
Du coup, je propose cette logique pour gauche|add:droite :- si gauche est convertible en décimal, alors on converti "de force" droite en décimal (avec échec = 0) et on additionne
- si droite est convertible en décimal, alors on tente de convertir le gauche en décimal : si ça marche, on additionne. Si le gauche est vide ou inexistant, il vaut 0 et on additionne.
- dans les autres cas : on bascule vers le add de Django
Il restera le cas de deux variables inexistantes ou vides dont l'addition valait 0... ça ne sera plus vrai, mais ça reverra le vide, alors je considère que "ça va".
(et si c'est cette logique qu'on adopte, il faudra aussi la renvoyer vers Combo).
Mis à jour par Frédéric Péters il y a environ 4 ans
Je serais, sans me soucier de la position des termes,
- nombre et nombre → addition
- nombre et None → nombre (+ 0)
- nombre et chaine vide → nombre (+ 0)
- nombre et autre chose → django add
- None et None → None
- chaine et None → chaine (+ "")
- autre chose et autre chose → django add
en définissant comme nombre ce qui sort sans erreur de Decimal(value).quantize(Decimal('1.0000')).normalize() (ex: "12,3").
Et j'oublie peut-être des situations.
Mis à jour par Nicolas Roche il y a environ 4 ans
- Statut changé de Nouveau à En cours
- Assigné à mis à Nicolas Roche
number2 None '' other2 number1 n1+n2 n1 n1 django_add None None '' other2 '' '' other2 autre django_add
Il manque seulement : "" et None → ""
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier 0001-templatetags-manage-string-concatenation-on-add-filt.patch 0001-templatetags-manage-string-concatenation-on-add-filt.patch ajouté
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
(Le filtre add Django retourne "" si on l'utilise avec None.)
Mis à jour par Thomas Noël il y a environ 4 ans
Le filtre add Django retourne "" si on l'utilise avec None.
Mais tu n'as pas mis "native" dans la matrice pour ce cas, semble-t-il.
Aussi, quand un terme est "?" et que l'autre est None, tu renvoies vers onNone. Il faut plutôt faire du natif dans ce cas, je crois.
Et je ne suis pas très à l'aise avec l'idée de répondre "None" dans None+None, je préférerais qu'on réponde "". Pourquoi pensais-tu mieux de répondre None, Frédéric ?
Mis à jour par Frédéric Péters il y a environ 4 ans
Je n'ai pas de souvenir particulier d'exemple me menant à ça, c'était il y a plusieurs heures déjà...
Mis à jour par Thomas Noël il y a environ 4 ans
Je préfère que None+None renvoie "" comme le fait Django par défaut.
En reprenant les règles de Frédéric qui me vont bien :
- nombre et nombre → addition
- nombre et None → nombre (+ 0)
- nombre et chaine vide → nombre (+ 0)
- chaine et None → chaine (+ "")
et "tout le reste" via django add, dans ce que listait Frédéric :
- nombre et autre chose → django add
- None et None → django add
- autre chose et autre chose → django add
On voit qu'avec cette logique, les None peuvent être remplacés par "" avant les tests, et il ne reste que :
- nombre et nombre → addition
- nombre et chaine vide → nombre (+ 0)
Dans les tests, il faudrait aussi vérifier ce que tout ça va donner avec des variables non existantes à droite comme à gauche (il faudrait qu'elles soient considérées comme vides).
Nicolas, la notion de matrice est jolie, mais si essaye de voir quelques instants si on ne peut pas écrire ça sous une suite de "if" plus parlante, sait-on jamais.
Pour info le code de Django:
################### # INTEGERS # ################### @register.filter(is_safe=False) def add(value, arg): """Add the arg to the value.""" try: return int(value) + int(arg) except (ValueError, TypeError): try: return value + arg except Exception: return ''
(ouaip, c'est rangé dans le code comme faisant partie des additions sur des entiers, amusant)
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier 0003-sms-add-endpoint-to-send-sms-asynchronously-21465.patch ajouté
- Fichier 0002-sms-factorise-sms-code-on-parameters-21465.patch ajouté
- Fichier 0001-sms-add-SMS-class-to-store-sms-parameters-21465.patch ajouté
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier
0001-sms-add-SMS-class-to-store-sms-parameters-21465.patchsupprimé
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier
0002-sms-factorise-sms-code-on-parameters-21465.patchsupprimé
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier
0003-sms-add-endpoint-to-send-sms-asynchronously-21465.patchsupprimé
Mis à jour par Nicolas Roche il y a environ 4 ans
- Fichier 0001-templatetags-manage-string-concatenation-on-add-filt.patch 0001-templatetags-manage-string-concatenation-on-add-filt.patch ajouté
(désolé pour la fausse manip)
Mis à jour par Frédéric Péters il y a environ 4 ans
fail-back → fallback.
both termes → both terms.
Dans les tests, c'est bizarre d'avoir des lignes qui disparaissent et ne pas savoir ce qu'elles deviennent, genre :
- assert tmpl.render({'term1': 'not a number', 'term2': 1.2}) == '1.2'
je préférerais que la ligne reste, avec son résultat différent. (pareil pour les autres).
Manquent des tests avec la virgule comme séparateur décimal.
Mis à jour par Nicolas Roche il y a environ 4 ans
- Lié à Development #41868: Ajouter la conversion décimal sur les fitres mathématiques par défaut ajouté
Mis à jour par Nicolas Roche il y a environ 4 ans
Mis à jour par Frédéric Péters il y a environ 4 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Nicolas Roche il y a environ 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 942afd8e9f016dc02b4c4cd8fa4c6922517227ec Author: Nicolas ROCHE <nroche@entrouvert.com> Date: Fri Apr 24 10:50:17 2020 +0200 templatetags: manage string concatenation on add filter (#42062)
Mis à jour par Frédéric Péters il y a environ 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Nicolas Roche il y a environ 4 ans
- Lié à Development #42653: Simplification du filtre add ajouté
templatetags: manage string concatenation on add filter (#42062)