Code

Ticket #7153: 7153.diff

File 7153.diff, 3.3 KB (added by alexkoshelev, 5 years ago)

Better path with tests for current trunk

Line 
1Index: django/template/__init__.py
2===================================================================
3--- django/template/__init__.py (revision 9905)
4+++ django/template/__init__.py (working copy)
5@@ -703,21 +703,6 @@
6             except (TypeError, AttributeError, KeyError):
7                 try: # attribute lookup
8                     current = getattr(current, bit)
9-                    if callable(current):
10-                        if getattr(current, 'alters_data', False):
11-                            current = settings.TEMPLATE_STRING_IF_INVALID
12-                        else:
13-                            try: # method call (assuming no args required)
14-                                current = current()
15-                            except TypeError: # arguments *were* required
16-                                # GOTCHA: This will also catch any TypeError
17-                                # raised in the function itself.
18-                                current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
19-                            except Exception, e:
20-                                if getattr(e, 'silent_variable_failure', False):
21-                                    current = settings.TEMPLATE_STRING_IF_INVALID
22-                                else:
23-                                    raise
24                 except (TypeError, AttributeError):
25                     try: # list-index lookup
26                         current = current[int(bit)]
27@@ -732,6 +717,21 @@
28                         current = settings.TEMPLATE_STRING_IF_INVALID
29                     else:
30                         raise
31+            if callable(current):
32+                if getattr(current, 'alters_data', False):
33+                    current = settings.TEMPLATE_STRING_IF_INVALID
34+                else:
35+                    try: # method call (assuming no args required)
36+                        current = current()
37+                    except TypeError: # arguments *were* required
38+                        # GOTCHA: This will also catch any TypeError
39+                        # raised in the function itself.
40+                        current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
41+                    except Exception, e:
42+                        if getattr(e, 'silent_variable_failure', False):
43+                            current = settings.TEMPLATE_STRING_IF_INVALID
44+                        else:
45+                            raise
46 
47         return current
48 
49Index: tests/regressiontests/templates/tests.py
50===================================================================
51--- tests/regressiontests/templates/tests.py    (revision 9905)
52+++ tests/regressiontests/templates/tests.py    (working copy)
53@@ -299,6 +299,9 @@
54             'basic-syntax25': ('{{ "fred" }}', {}, "fred"),
55             'basic-syntax26': (r'{{ "\"fred\"" }}', {}, "\"fred\""),
56             'basic-syntax27': (r'{{ _("\"fred\"") }}', {}, "\"fred\""),
57+           
58+            # resolve function in context top level
59+            'basic-syntax28': (r'{{foobar}}', {"foobar": lambda: "foo bar"}, "foo bar"),
60 
61             # List-index syntax allows a template to access a certain item of a subscriptable object.
62             'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"),