Code

Ticket #6766: template_if_invalid.diff

File template_if_invalid.diff, 7.0 KB (added by guettli, 6 years ago)

Previous patch included the function twice.

Line 
1Index: tests/regressiontests/templates/tests.py
2===================================================================
3--- tests/regressiontests/templates/tests.py    (Revision 7235)
4+++ tests/regressiontests/templates/tests.py    (Arbeitskopie)
5@@ -568,11 +568,11 @@
6             'ifequal06': ("{% ifequal a 'test' %}yes{% else %}no{% endifequal %}", {"a": "no"}, "no"),
7             'ifequal07': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "test"}, "yes"),
8             'ifequal08': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "no"}, "no"),
9-            'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, "no"),
10-            'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, "yes"),
11+            'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, ('no', 'INVALID %s', 'a')),
12+            'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, ('yes', 'INVALID %s', 'a')),
13 
14             # SMART SPLITTING
15-            'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, "no"),
16+            'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, ('no', 'INVALID %s', 'a')),
17             'ifequal-split02': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'foo'}, "no"),
18             'ifequal-split03': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'test man'}, "yes"),
19             'ifequal-split04': ("{% ifequal a 'test man' %}yes{% else %}no{% endifequal %}", {'a': 'test man'}, "yes"),
20@@ -590,7 +590,7 @@
21             'ifequal-numeric04': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5.2}, 'yes'),
22             'ifequal-numeric05': ('{% ifequal x 0.2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
23             'ifequal-numeric06': ('{% ifequal x .2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
24-            'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ''),
25+            'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ('', 'INVALID %s', '2.')),
26             'ifequal-numeric08': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': 5}, ''),
27             'ifequal-numeric09': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': '5'}, 'yes'),
28             'ifequal-numeric10': ('{% ifequal x -5 %}yes{% endifequal %}', {'x': -5}, 'yes'),
29@@ -759,11 +759,12 @@
30 
31             'invalidstr01': ('{{ var|default:"Foo" }}', {}, ('Foo','INVALID')),
32             'invalidstr02': ('{{ var|default_if_none:"Foo" }}', {}, ('','INVALID')),
33-            'invalidstr03': ('{% for v in var %}({{ v }}){% endfor %}', {}, ''),
34+            'invalidstr03': ('{% for v in var %}({{ v }}){% endfor %}', {}, ('', 'INVALID')),
35             'invalidstr04': ('{% if var %}Yes{% else %}No{% endif %}', {}, 'No'),
36             'invalidstr04': ('{% if var|default:"Foo" %}Yes{% else %}No{% endif %}', {}, 'Yes'),
37             'invalidstr05': ('{{ var }}', {}, ('', 'INVALID %s', 'var')),
38             'invalidstr06': ('{{ var.prop }}', {'var': {}}, ('', 'INVALID %s', 'var.prop')),
39+            'invalidstr07': ('{% ifequal var "abc" %}{{ var }}{% endifequal %}', {}, ('', 'INVALID %s', 'var')),
40 
41             ### MULTILINE #############################################################
42 
43Index: django/template/__init__.py
44===================================================================
45--- django/template/__init__.py (Revision 7235)
46+++ django/template/__init__.py (Arbeitskopie)
47@@ -99,6 +99,13 @@
48 # True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means
49 # uninitialised.
50 invalid_var_format_string = None
51+def template_string_if_invalid(variable):
52+    global invalid_var_format_string
53+    if invalid_var_format_string is None:
54+        invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
55+    if invalid_var_format_string:
56+        return settings.TEMPLATE_STRING_IF_INVALID % variable
57+    return settings.TEMPLATE_STRING_IF_INVALID
58 
59 class TemplateSyntaxError(Exception):
60     def __str__(self):
61@@ -510,20 +517,17 @@
62         self.filters = filters
63         self.var = Variable(var)
64 
65-    def resolve(self, context, ignore_failures=False):
66+    def resolve(self, context, ignore_failures=False, raise_failures=False):
67         try:
68             obj = self.var.resolve(context)
69         except VariableDoesNotExist:
70             if ignore_failures:
71                 obj = None
72+            elif raise_failures:
73+                raise
74             else:
75                 if settings.TEMPLATE_STRING_IF_INVALID:
76-                    global invalid_var_format_string
77-                    if invalid_var_format_string is None:
78-                        invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
79-                    if invalid_var_format_string:
80-                        return settings.TEMPLATE_STRING_IF_INVALID % self.var
81-                    return settings.TEMPLATE_STRING_IF_INVALID
82+                    return template_string_if_invalid(self.var)
83                 else:
84                     obj = settings.TEMPLATE_STRING_IF_INVALID
85         for func, args in self.filters:
86Index: django/template/defaulttags.py
87===================================================================
88--- django/template/defaulttags.py      (Revision 7235)
89+++ django/template/defaulttags.py      (Arbeitskopie)
90@@ -8,7 +8,7 @@
91 except NameError:
92     from django.utils.itercompat import reversed     # Python 2.3 fallback
93 
94-from django.template import Node, NodeList, Template, Context, Variable
95+from django.template import Node, NodeList, Template, Context, Variable, template_string_if_invalid
96 from 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
97 from django.template import get_library, Library, InvalidTemplateLibrary
98 from django.conf import settings
99@@ -114,8 +114,10 @@
100             parentloop = {}
101         context.push()
102         try:
103-            values = self.sequence.resolve(context, True)
104+            values = self.sequence.resolve(context, raise_failures=True)
105         except VariableDoesNotExist:
106+            if settings.TEMPLATE_STRING_IF_INVALID:
107+                return settings.TEMPLATE_STRING_IF_INVALID % self.sequence
108             values = []
109         if values is None:
110             values = []
111@@ -200,10 +202,14 @@
112         try:
113             val1 = self.var1.resolve(context)
114         except VariableDoesNotExist:
115+            if settings.TEMPLATE_STRING_IF_INVALID:
116+                return template_string_if_invalid(self.var1)
117             val1 = None
118         try:
119             val2 = self.var2.resolve(context)
120         except VariableDoesNotExist:
121+            if settings.TEMPLATE_STRING_IF_INVALID:
122+                return template_string_if_invalid(self.var2)
123             val2 = None
124         if (self.negate and val1 != val2) or (not self.negate and val1 == val2):
125             return self.nodelist_true.render(context)