Commit 47a131b9 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Encapsulated TEMPLATE_STRING_IF_INVALID in Engine.

parent 37505b63
Loading
Loading
Loading
Loading
+10 −15
Original line number Diff line number Diff line
@@ -71,10 +71,6 @@ libraries = {}
# global list of libraries to load by default for a new parser
builtins = []

# True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means
# uninitialized.
invalid_var_format_string = None


class TemplateSyntaxError(Exception):
    pass
@@ -601,15 +597,14 @@ class FilterExpression(object):
                if ignore_failures:
                    obj = None
                else:
                    if settings.TEMPLATE_STRING_IF_INVALID:
                        global invalid_var_format_string
                        if invalid_var_format_string is None:
                            invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
                        if invalid_var_format_string:
                            return settings.TEMPLATE_STRING_IF_INVALID % self.var
                        return settings.TEMPLATE_STRING_IF_INVALID
                    string_if_invalid = context.engine.string_if_invalid
                    if string_if_invalid:
                        if '%s' in string_if_invalid:
                            return string_if_invalid % self.var
                        else:
                            return string_if_invalid
                    else:
                        obj = settings.TEMPLATE_STRING_IF_INVALID
                        obj = string_if_invalid
        else:
            obj = self.var
        for func, args in self.filters:
@@ -794,7 +789,7 @@ class Variable(object):
                    if getattr(current, 'do_not_call_in_templates', False):
                        pass
                    elif getattr(current, 'alters_data', False):
                        current = settings.TEMPLATE_STRING_IF_INVALID
                        current = context.engine.string_if_invalid
                    else:
                        try:  # method call (assuming no args required)
                            current = current()
@@ -802,12 +797,12 @@ class Variable(object):
                            try:
                                getcallargs(current)
                            except TypeError:  # arguments *were* required
                                current = settings.TEMPLATE_STRING_IF_INVALID  # invalid method call
                                current = context.engine.string_if_invalid  # invalid method call
                            else:
                                raise
        except Exception as e:
            if getattr(e, 'silent_variable_failure', False):
                current = settings.TEMPLATE_STRING_IF_INVALID
                current = context.engine.string_if_invalid
            else:
                raise

+1 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ class BlockTranslateNode(Node):
                result = translation.pgettext(message_context, singular)
            else:
                result = translation.ugettext(singular)
        default_value = settings.TEMPLATE_STRING_IF_INVALID
        default_value = context.engine.string_if_invalid

        def render_value(key):
            if key in context:
+5 −10
Original line number Diff line number Diff line
@@ -12,8 +12,7 @@ from django import template
from django.conf import settings
from django.contrib.auth.models import Group
from django.core import urlresolvers
from django.template import (base as template_base, loader, Context,
    RequestContext, Template, TemplateSyntaxError)
from django.template import loader, Context, RequestContext, Template, TemplateSyntaxError
from django.template.engine import Engine
from django.template.loaders import app_directories, filesystem
from django.test import RequestFactory, TestCase
@@ -550,14 +549,15 @@ class TemplateTests(TestCase):
            failures = []
            tests = sorted(template_tests.items())

            # Set TEMPLATE_STRING_IF_INVALID to a known string.
            expected_invalid_str = 'INVALID'

            # Warm the URL reversing cache. This ensures we don't pay the cost
            # warming the cache during one of the tests.
            urlresolvers.reverse('named.client', args=(0,))

            for name, vals in tests:

                # Set TEMPLATE_STRING_IF_INVALID to a known string.
                expected_invalid_str = 'INVALID'

                if isinstance(vals[2], tuple):
                    normal_string_result = vals[2][0]
                    invalid_string_result = vals[2][1]
@@ -565,7 +565,6 @@ class TemplateTests(TestCase):
                    if isinstance(invalid_string_result, tuple):
                        expected_invalid_str = 'INVALID %s'
                        invalid_string_result = invalid_string_result[0] % invalid_string_result[1]
                        template_base.invalid_var_format_string = True

                    try:
                        template_debug_result = vals[2][2]
@@ -622,10 +621,6 @@ class TemplateTests(TestCase):

                    Engine.get_default().template_loaders[0].reset()

                if template_base.invalid_var_format_string:
                    expected_invalid_str = 'INVALID'
                    template_base.invalid_var_format_string = False

        self.assertEqual(failures, [], "Tests failed:\n%s\n%s" %
            ('-' * 70, ("\n%s\n" % ('-' * 70)).join(failures)))