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.conf import settings
from django.template import Library, Node, TemplateSyntaxError, Variable from django.template import Library, Node, TemplateSyntaxError, Variable
from django.template.base import TokenType, render_value_in_context 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) singular, vars = self.render_token_list(self.singular)
if self.plural and self.countervar and self.counter: if self.plural and self.countervar and self.counter:
count = self.counter.resolve(context) 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 context[self.countervar] = count
plural, plural_vars = self.render_token_list(self.plural) plural, plural_vars = self.render_token_list(self.plural)
if message_context: if message_context:

View File

@ -298,6 +298,15 @@ class I18nBlockTransTagTests(SimpleTestCase):
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template', {'a': [1, 2, 3]}) 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': ( @setup({'template': (
'{% load i18n %}{% blocktranslate count count=var|length %}' '{% load i18n %}{% blocktranslate count count=var|length %}'
'There is {{ count }} object. {% block a %} {% endblock %}' 'There is {{ count }} object. {% block a %} {% endblock %}'