misc: add |sum template filter (#56380)

This commit is contained in:
Valentin Deniaud 2021-08-26 16:33:00 +02:00
parent 9050ab6cd2
commit e717381c85
2 changed files with 24 additions and 0 deletions

View File

@ -725,3 +725,14 @@ def extra_context(cell, request):
if hasattr(cell, 'repeat_index'):
ctx['repeat_index'] = cell.repeat_index
return ctx
@register.filter(name='sum')
def sum_(list_):
if isinstance(list_, str):
# do not consider string as iterable, to avoid misusage
return ''
try:
return sum(parse_decimal(term) for term in list_)
except TypeError: # list_ is not iterable
return ''

View File

@ -894,3 +894,16 @@ def test_django_contrib_humanize_filters():
with override_settings(LANGUAGE_CODE='fr-fr'):
assert tmpl.render(Context({'foo': 10000})) == '10 000'
assert tmpl.render(Context({'foo': '10000'})) == '10 000'
def test_sum():
t = Template('{{ "2 29.5 9,5 .5"|split|sum }}')
assert t.render(Context()) == '41.5'
t = Template('{{ list|sum }}')
assert t.render(Context({'list': [1, 2, '3']})) == '6'
assert t.render(Context({'list': [1, 2, 'x']})) == '3'
assert t.render(Context({'list': [None, 2.0, 'x']})) == '2'
assert t.render(Context({'list': []})) == '0'
assert t.render(Context({'list': None})) == '' # list is not iterable
assert t.render(Context({'list': '123'})) == '' # consider string as not iterable
assert t.render(Context()) == ''