Projet

Général

Profil

Development #27699

Créer un filtre Django |Decimal

Ajouté par Pierre Cros il y a plus de 5 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
31 octobre 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Il est déjà dans la doc et dois permettre de transformer une variable texte en nombre.

Message Jabber de Fred : il pourrait être plus intelligent que le Decimal() pur de Python, genre il accepterait les virgules comme séparateur.


Fichiers

Révisions associées

Révision 9e2226a7 (diff)
Ajouté par Frédéric Péters il y a plus de 5 ans

misc: add a |decimal template tag (#27699)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 5 ans

|decimal, pour garder tout en minuscules.

#2

Mis à jour par Thomas Noël il y a plus de 5 ans

Oui mais bon, j'ai du mal à voir l'usage exact, car Django ne permet pas d'opération de calcul ensuite (ce qui est le cas d'usage des décimaux)

#3

Mis à jour par Frédéric Péters il y a plus de 5 ans

#4

Mis à jour par Paul Marillonnet il y a plus de 5 ans

Pareil je vois pas l'usage.
Sinon s/confort/comfort/ dans le patch (une des lignes de commentaire).

#5

Mis à jour par Frédéric Péters il y a plus de 5 ans

L'exemple dans la documentation c'est :

form_var_nombre_de_reservations|decimal > 1 : À partir de deux réservations, la condition sera vérifiée.

Oui ça marcherait aussi bien avec un |int à inventer ou le natif |floatformat, ou un hack façon |add:0 mais |decimal offre ici quelque chose de plus clair à lire, je trouve.

#6

Mis à jour par Thomas Noël il y a plus de 5 ans

Sur le cas d'usage :

form_var_nombre_de_reservations|decimal > 1

En Django ça va crasher sur '' > 1 → TemplateSyntaxError

Il faudrait plutôt renvoyer None quand on n'arrive pas à décoder.

In [7]: Template('{% if 2 > 1 %}ok{% endif %}').render(Context({}))
Out[7]: u'ok'

In [8]: Template('{% if None > 1 %}ok{% endif %}').render(Context({}))
Out[8]: u''

In [9]: Template('{% if '' > 1 %}ok{% endif %}').render(Context({}))
TemplateSyntaxError: Not expecting '>' in this position in if tag.
#7

Mis à jour par Frédéric Péters il y a plus de 5 ans

Les chaines en template django c'est "", pas '', c'est ça qui fait échouer cette affaire.

Retourner la chaine vide, c'est le comportement usuel des filtres Django, ce que fait |floatformat, en version très courte :

    try:
        input_val = repr(text)
        d = Decimal(input_val)
    except UnicodeEncodeError:
        return ''

ou |first,

@register.filter(is_safe=False)
def first(value):
    """Returns the first item in a list.""" 
    try:
        return value[0]
    except IndexError:
        return ''

(patch actualisé avec "comfort" et des tests de condition)

#8

Mis à jour par Thomas Noël il y a plus de 5 ans

  • Statut changé de Solution proposée à Solution validée

Frédéric Péters a écrit :

Les chaines en template django c'est "", pas '', c'est ça qui fait échouer cette affaire.

Quel boulet. On verra ce qui se passera avec Python3, autre affaire, pour plus tard.

Retourner la chaine vide, c'est le comportement usuel des filtres Django, ce que fait |floatformat, en version très courte :

Ok.

Reste le passage avec le .normalize() dont je n'étais pas sûr, parce que

In [26]: Decimal('1000').quantize(Decimal('1.0000')).normalize()
Out[26]: Decimal('1E+3')

mais ça passe, Django affiche bien "1000".

Autre truc pas bien compris mais je suis fatigué, Decimal('toto') ça fait chez moi une InvalidOperation et pas une ArithmeticError.

Mais vu que les tests passent, ack.

#9

Mis à jour par Frédéric Péters il y a plus de 5 ans

Autre truc pas bien compris mais je suis fatigué, Decimal('toto') ça fait chez moi une InvalidOperation et pas une ArithmeticError.

class DecimalException(ArithmeticError):
...
class InvalidOperation(DecimalException):
...
#10

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 9e2226a713910ffc07826eb5104b22bf0cfcb647
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Oct 31 12:06:20 2018 +0100

    misc: add a |decimal template tag (#27699)
#11

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF