templatetags: add ceil, floor and abs filters (#41694)
This commit is contained in:
parent
219344e0db
commit
0633dac752
|
@ -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',
|
||||
|
|
|
@ -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>'
|
||||
|
|
Loading…
Reference in New Issue