templatetags: add ceil, floor and abs filters (#41694)

This commit is contained in:
Nicolas Roche 2020-05-07 15:18:36 +02:00
parent 219344e0db
commit 0633dac752
2 changed files with 60 additions and 0 deletions

View File

@ -21,6 +21,7 @@ from decimal import Decimal
from decimal import InvalidOperation as DecimalInvalidOperation
from decimal import DivisionByZero as DecimalDivisionByZero
import json
import math
import time
from django import template
@ -492,6 +493,18 @@ def divide(term1, term2):
except DecimalDivisionByZero:
return ''
@register.filter
def ceil(value):
'''the smallest integer value greater than or equal to value'''
return decimal(math.ceil(parse_decimal(value)))
@register.filter
def floor(value):
return decimal(math.floor(parse_decimal(value)))
@register.filter(name='abs')
def abs_(value):
return decimal(abs(parse_decimal(value)))
_json_script_escapes = {
ord('>'): '\\u003E',

View File

@ -624,6 +624,53 @@ def test_mathematics_templatetag():
assert tmpl.render(Context({'term1': 2, 'term2': 3})) == '0.67'
def test_rounding_templatetag():
# ceil
tmpl = Template('{{ value|ceil }}')
assert tmpl.render(Context({'value': 3.14})) == '4'
assert tmpl.render(Context({'value': 3.99})) == '4'
assert tmpl.render(Context({'value': -3.14})) == '-3'
assert tmpl.render(Context({'value': -3.99})) == '-3'
assert tmpl.render(Context({'value': 0})) == '0'
assert tmpl.render(Context({'value': '3.14'})) == '4'
assert tmpl.render(Context({'value': '3.99'})) == '4'
assert tmpl.render(Context({'value': '-3.14'})) == '-3'
assert tmpl.render(Context({'value': '-3.99'})) == '-3'
assert tmpl.render(Context({'value': '0'})) == '0'
assert tmpl.render(Context({'value': 'not a number'})) == '0'
assert tmpl.render(Context({'value': ''})) == '0'
assert tmpl.render(Context({'value': None})) == '0'
# floor
tmpl = Template('{{ value|floor }}')
assert tmpl.render(Context({'value': 3.14})) == '3'
assert tmpl.render(Context({'value': 3.99})) == '3'
assert tmpl.render(Context({'value': -3.14})) == '-4'
assert tmpl.render(Context({'value': -3.99})) == '-4'
assert tmpl.render(Context({'value': 0})) == '0'
assert tmpl.render(Context({'value': '3.14'})) == '3'
assert tmpl.render(Context({'value': '3.99'})) == '3'
assert tmpl.render(Context({'value': '-3.14'})) == '-4'
assert tmpl.render(Context({'value': '-3.99'})) == '-4'
assert tmpl.render(Context({'value': '0'})) == '0'
assert tmpl.render(Context({'value': 'not a number'})) == '0'
assert tmpl.render(Context({'value': ''})) == '0'
assert tmpl.render(Context({'value': None})) == '0'
def test_abs_templatetag():
tmpl = Template('{{ value|abs }}')
assert tmpl.render(Context({'value': 3.14})) == '3.14'
assert tmpl.render(Context({'value': -3.14})) == '3.14'
assert tmpl.render(Context({'value': 0})) == '0'
assert tmpl.render(Context({'value': '3.14'})) == '3.14'
assert tmpl.render(Context({'value': '-3.14'})) == '3.14'
assert tmpl.render(Context({'value': '0'})) == '0'
assert tmpl.render(Context({'value': 'not a number'})) == '0'
assert tmpl.render(Context({'value': ''})) == '0'
assert tmpl.render(Context({'value': None})) == '0'
def test_json_script():
tmpl = Template('{{ plop|json_script:"toto" }}')
assert tmpl.render(Context({'plop': {'a': 'b'}})) == '<script id="toto" type="application/json">{"a": "b"}</script>'