Django

Code

Ticket #6766: template_if_invalid.diff

File template_if_invalid.diff, 7.0 kB (added by guettli, 2 years ago)

Previous patch included the function twice.

  • tests/regressiontests/templates/tests.py

    old new  
    568568            'ifequal06': ("{% ifequal a 'test' %}yes{% else %}no{% endifequal %}", {"a": "no"}, "no"), 
    569569            'ifequal07': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "test"}, "yes"), 
    570570            'ifequal08': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "no"}, "no"), 
    571             'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, "no"), 
    572             'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, "yes"), 
     571            'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, ('no', 'INVALID %s', 'a')), 
     572            'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, ('yes', 'INVALID %s', 'a')), 
    573573 
    574574            # SMART SPLITTING 
    575             'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, "no"), 
     575            'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, ('no', 'INVALID %s', 'a')), 
    576576            'ifequal-split02': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'foo'}, "no"), 
    577577            'ifequal-split03': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'test man'}, "yes"), 
    578578            'ifequal-split04': ("{% ifequal a 'test man' %}yes{% else %}no{% endifequal %}", {'a': 'test man'}, "yes"), 
     
    590590            'ifequal-numeric04': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5.2}, 'yes'), 
    591591            'ifequal-numeric05': ('{% ifequal x 0.2 %}yes{% endifequal %}', {'x': .2}, 'yes'), 
    592592            'ifequal-numeric06': ('{% ifequal x .2 %}yes{% endifequal %}', {'x': .2}, 'yes'), 
    593             'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ''), 
     593            'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ('', 'INVALID %s', '2.')), 
    594594            'ifequal-numeric08': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': 5}, ''), 
    595595            'ifequal-numeric09': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': '5'}, 'yes'), 
    596596            'ifequal-numeric10': ('{% ifequal x -5 %}yes{% endifequal %}', {'x': -5}, 'yes'), 
     
    759759 
    760760            'invalidstr01': ('{{ var|default:"Foo" }}', {}, ('Foo','INVALID')), 
    761761            'invalidstr02': ('{{ var|default_if_none:"Foo" }}', {}, ('','INVALID')), 
    762             'invalidstr03': ('{% for v in var %}({{ v }}){% endfor %}', {}, ''), 
     762            'invalidstr03': ('{% for v in var %}({{ v }}){% endfor %}', {}, ('', 'INVALID')), 
    763763            'invalidstr04': ('{% if var %}Yes{% else %}No{% endif %}', {}, 'No'), 
    764764            'invalidstr04': ('{% if var|default:"Foo" %}Yes{% else %}No{% endif %}', {}, 'Yes'), 
    765765            'invalidstr05': ('{{ var }}', {}, ('', 'INVALID %s', 'var')), 
    766766            'invalidstr06': ('{{ var.prop }}', {'var': {}}, ('', 'INVALID %s', 'var.prop')), 
     767            'invalidstr07': ('{% ifequal var "abc" %}{{ var }}{% endifequal %}', {}, ('', 'INVALID %s', 'var')), 
    767768 
    768769            ### MULTILINE ############################################################# 
    769770 
  • django/template/__init__.py

    old new  
    9999# True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means 
    100100# uninitialised. 
    101101invalid_var_format_string = None 
     102def template_string_if_invalid(variable): 
     103    global invalid_var_format_string 
     104    if invalid_var_format_string is None: 
     105        invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID 
     106    if invalid_var_format_string: 
     107        return settings.TEMPLATE_STRING_IF_INVALID % variable 
     108    return settings.TEMPLATE_STRING_IF_INVALID 
    102109 
    103110class TemplateSyntaxError(Exception): 
    104111    def __str__(self): 
     
    510517        self.filters = filters 
    511518        self.var = Variable(var) 
    512519 
    513     def resolve(self, context, ignore_failures=False): 
     520    def resolve(self, context, ignore_failures=False, raise_failures=False): 
    514521        try: 
    515522            obj = self.var.resolve(context) 
    516523        except VariableDoesNotExist: 
    517524            if ignore_failures: 
    518525                obj = None 
     526            elif raise_failures: 
     527                raise 
    519528            else: 
    520529                if settings.TEMPLATE_STRING_IF_INVALID: 
    521                     global invalid_var_format_string 
    522                     if invalid_var_format_string is None: 
    523                         invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID 
    524                     if invalid_var_format_string: 
    525                         return settings.TEMPLATE_STRING_IF_INVALID % self.var 
    526                     return settings.TEMPLATE_STRING_IF_INVALID 
     530                    return template_string_if_invalid(self.var) 
    527531                else: 
    528532                    obj = settings.TEMPLATE_STRING_IF_INVALID 
    529533        for func, args in self.filters: 
  • django/template/defaulttags.py

    old new  
    88except NameError: 
    99    from django.utils.itercompat import reversed     # Python 2.3 fallback 
    1010 
    11 from django.template import Node, NodeList, Template, Context, Variable 
     11from django.template import Node, NodeList, Template, Context, Variable, template_string_if_invalid 
    1212from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, SINGLE_BRACE_START, SINGLE_BRACE_END, COMMENT_TAG_START, COMMENT_TAG_END 
    1313from django.template import get_library, Library, InvalidTemplateLibrary 
    1414from django.conf import settings 
     
    114114            parentloop = {} 
    115115        context.push() 
    116116        try: 
    117             values = self.sequence.resolve(context, True) 
     117            values = self.sequence.resolve(context, raise_failures=True) 
    118118        except VariableDoesNotExist: 
     119            if settings.TEMPLATE_STRING_IF_INVALID: 
     120                return settings.TEMPLATE_STRING_IF_INVALID % self.sequence 
    119121            values = [] 
    120122        if values is None: 
    121123            values = [] 
     
    200202        try: 
    201203            val1 = self.var1.resolve(context) 
    202204        except VariableDoesNotExist: 
     205            if settings.TEMPLATE_STRING_IF_INVALID: 
     206                return template_string_if_invalid(self.var1) 
    203207            val1 = None 
    204208        try: 
    205209            val2 = self.var2.resolve(context) 
    206210        except VariableDoesNotExist: 
     211            if settings.TEMPLATE_STRING_IF_INVALID: 
     212                return template_string_if_invalid(self.var2) 
    207213            val2 = None 
    208214        if (self.negate and val1 != val2) or (not self.negate and val1 == val2): 
    209215            return self.nodelist_true.render(context)