Fixed #18995 -- Made blocktranslate tag raise TemplateSyntaxError when plural count is not a number.

This commit is contained in:
Jacob Walls 2020-09-26 15:03:13 -04:00 committed by Mariusz Felisiak
parent 848770dd2c
commit 01a7af09b9
2 changed files with 16 additions and 0 deletions

View File

@ -1,3 +1,5 @@
from decimal import Decimal
from django.conf import settings
from django.template import Library, Node, TemplateSyntaxError, Variable
from django.template.base import TokenType, render_value_in_context
@ -135,6 +137,11 @@ class BlockTranslateNode(Node):
singular, vars = self.render_token_list(self.singular)
if self.plural and self.countervar and self.counter:
count = self.counter.resolve(context)
if not isinstance(count, (Decimal, float, int)):
raise TemplateSyntaxError(
"%r argument to %r tag must be a number."
% (self.countervar, self.tag_name)
)
context[self.countervar] = count
plural, plural_vars = self.render_token_list(self.plural)
if message_context:

View File

@ -298,6 +298,15 @@ class I18nBlockTransTagTests(SimpleTestCase):
with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template', {'a': [1, 2, 3]})
@setup({'template': (
'{% load i18n %}{% blocktranslate count counter=num %}{{ counter }}'
'{% plural %}{{ counter }}{% endblocktranslate %}'
)})
def test_count_not_number(self, tag_name):
msg = "'counter' argument to '{}' tag must be a number.".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template', {'num': '1'})
@setup({'template': (
'{% load i18n %}{% blocktranslate count count=var|length %}'
'There is {{ count }} object. {% block a %} {% endblock %}'