misc: add |clamp, |limit_low and |limit_high filters (#43264) #654

Merged
fpeters merged 1 commits from wip/43264-clamp into main 2023-09-15 08:01:51 +02:00
2 changed files with 60 additions and 0 deletions

View File

@ -639,6 +639,40 @@ def test_abs_templatetag():
assert tmpl.render({'value': None}) == '0'
def test_clamp_templatetag():
tmpl = Template('{{ value|clamp:"3.5 5.5" }}')
assert tmpl.render({'value': 4}) == '4'
assert tmpl.render({'value': 6}) == '5.5'
assert tmpl.render({'value': 3}) == '3.5'
assert tmpl.render({'value': 'abc'}) == ''
assert tmpl.render({'value': None}) == ''
tmpl = Template('{{ value|clamp:"3.5 5.5 7.5" }}')
assert tmpl.render({'value': 4}) == ''
tmpl = Template('{{ value|clamp:"a b" }}')
assert tmpl.render({'value': 4}) == ''
def test_limit_templatetags():
for v in (3.5, '"3.5"', 'xxx'):
tmpl = Template('{{ value|limit_low:%s }}' % v)
assert tmpl.render({'value': 4, 'xxx': 3.5}) == '4'
assert tmpl.render({'value': 3, 'xxx': 3.5}) == '3.5'
assert tmpl.render({'value': 'abc', 'xxx': 3.5}) == ''
assert tmpl.render({'value': None, 'xxx': 3.5}) == ''
if v == 'xxx':
assert tmpl.render({'value': 3, 'xxx': 'plop'}) == ''
tmpl = Template('{{ value|limit_high:%s }}' % v)
assert tmpl.render({'value': 4, 'xxx': 3.5}) == '3.5'
assert tmpl.render({'value': 3, 'xxx': 3.5}) == '3'
assert tmpl.render({'value': 'abc', 'xxx': 3.5}) == ''
assert tmpl.render({'value': None, 'xxx': 3.5}) == ''
if v == 'xxx':
assert tmpl.render({'value': 3, 'xxx': 'plop'}) == ''
def test_token_decimal():
tokens = [Template('{% token_decimal 4 %}').render() for i in range(100)]
assert all(len(token) == 4 for token in tokens)

View File

@ -640,6 +640,32 @@ def abs_(value):
return decimal(abs(parse_decimal(value)))
@register.filter
def clamp(value, minmax):
try:
value = parse_decimal(value, do_raise=True)
min_value, max_value = (parse_decimal(x, do_raise=True) for x in unlazy(minmax).split())
except (ArithmeticError, TypeError, ValueError):
return ''
return max(min_value, min(value, max_value))
@register.filter
def limit_low(value, min_value):
try:
return max(parse_decimal(value, do_raise=True), parse_decimal(min_value, do_raise=True))
except (ArithmeticError, TypeError):
return ''
@register.filter
def limit_high(value, max_value):
try:
return min(parse_decimal(value, do_raise=True), parse_decimal(max_value, do_raise=True))
except (ArithmeticError, TypeError):
return ''
@register.simple_tag
def version_hash():
from wcs.qommon.admin.menu import get_vc_version