Code

Ticket #2539: template_04.diff

File template_04.diff, 5.5 KB (added by racter, 7 years ago)

adjusted limodou's patch to apply to trunk as of 6213

Line 
1Index: django/templatetags/__init__.py
2===================================================================
3--- django/templatetags/__init__.py     (revision 6213)
4+++ django/templatetags/__init__.py     (working copy)
5@@ -2,6 +2,10 @@
6 
7 for a in settings.INSTALLED_APPS:
8     try:
9+        path = __import__(a[:a.rindex('.')], '', '', ['']).__path__
10+        for i in path:
11+            if not i in __path__:
12+                __path__.append(i)
13         __path__.extend(__import__(a + '.templatetags', {}, {}, ['']).__path__)
14     except ImportError:
15         pass
16Index: django/template/__init__.py
17===================================================================
18--- django/template/__init__.py (revision 6213)
19+++ django/template/__init__.py (working copy)
20@@ -63,6 +63,7 @@
21 from django.utils.text import smart_split
22 from django.utils.encoding import smart_unicode, force_unicode
23 from django.utils.translation import ugettext as _
24+from django.utils.datastructures import SortedDict
25 
26 __all__ = ('Template', 'Context', 'RequestContext', 'compile_string')
27 
28@@ -261,6 +262,7 @@
29         self.tokens = tokens
30         self.tags = {}
31         self.filters = {}
32+        self.libs = {}
33         for lib in builtins:
34             self.add_library(lib)
35 
36@@ -289,7 +291,7 @@
37                 # execute callback function for this tag and append resulting node
38                 self.enter_command(command, token)
39                 try:
40-                    compile_func = self.tags[command]
41+                    compile_func = self.get_tags(command)
42                 except KeyError:
43                     self.invalid_block_tag(token, command)
44                 try:
45@@ -355,15 +357,43 @@
46     def add_library(self, lib):
47         self.tags.update(lib.tags)
48         self.filters.update(lib.filters)
49+        #save index of lib
50+        if hasattr(lib, 'appname'):
51+            d = self.libs.setdefault(lib.taglibname, SortedDict({}))
52+            d[lib.appname] = {'tags':lib.tags, 'filters': lib.filters}
53 
54+    def get_tags(self, tag):
55+        v = tag.split('.')
56+        if len(v) == 3:
57+            appname, taglibname, command = v
58+            return self.libs[taglibname][appname]['tags'][command]
59+        elif len(v) == 2:
60+            taglibname, command = v
61+            return self.libs[taglibname].values()[0]['tags'][command]
62+        else:
63+            return self.tags[tag]
64+
65+    def get_filters(self, filter_name):
66+        v = filter_name.split('.')
67+        if len(v) == 3:
68+            appname, taglibname, command = v
69+            return self.libs[taglibname][appname]['filters'][command]
70+        elif len(v) == 2:
71+            taglibname, command = v
72+            return self.libs[taglibname].values()[0]['filters'][command]
73+        else:
74+            return self.filters[filter_name]
75+
76     def compile_filter(self, token):
77         "Convenient wrapper for FilterExpression"
78         return FilterExpression(token, self)
79 
80     def find_filter(self, filter_name):
81-        if filter_name in self.filters:
82-            return self.filters[filter_name]
83-        else:
84+        try:
85+            return self.get_filters(filter_name)
86+        except:
87+            import traceback
88+            traceback.print_exc()
89             raise TemplateSyntaxError, "Invalid filter: '%s'" % filter_name
90 
91 class DebugParser(Parser):
92@@ -503,7 +533,7 @@
93 ^"(?P<constant>%(str)s)"|
94 ^(?P<var>[%(var_chars)s]+)|
95  (?:%(filter_sep)s
96-     (?P<filter_name>\w+)
97+     (?P<filter_name>[\w.]+)
98          (?:%(arg_sep)s
99              (?:
100               %(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s|
101@@ -914,15 +944,28 @@
102             return func
103         return dec
104 
105+import os.path
106 def get_library(module_name):
107     lib = libraries.get(module_name, None)
108     if not lib:
109         try:
110             mod = __import__(module_name, {}, {}, [''])
111+            #get the appname and tag module name from the __file__
112+            v = mod.__file__.replace('\\', '/').split('/')
113+            if v[-2] == 'templatetags':
114+                appname, taglibname = v[-3], os.path.splitext(v[-1])[0]
115+            else:
116+                appname, taglibname = None, None
117         except ImportError, e:
118+            import traceback
119+            traceback.print_exc()
120             raise InvalidTemplateLibrary, "Could not load template library from %s, %s" % (module_name, e)
121         try:
122             lib = mod.register
123+
124+            # assign appname and taglibname to lib
125+            lib.appname = appname
126+            lib.taglibname = taglibname
127             libraries[module_name] = lib
128         except AttributeError:
129             raise InvalidTemplateLibrary, "Template library %s does not have a variable named 'register'" % module_name
130Index: django/template/defaulttags.py
131===================================================================
132--- django/template/defaulttags.py      (revision 6213)
133+++ django/template/defaulttags.py      (working copy)
134@@ -795,9 +795,14 @@
135     for taglib in bits[1:]:
136         # add the library to the parser
137         try:
138-            lib = get_library("django.templatetags.%s" % taglib.split('.')[-1])
139+            if taglib.find('.') > -1:
140+                appname, module = taglib.split('.')
141+                taglib = '.'.join([appname, 'templatetags', module])
142+            lib = get_library("django.templatetags.%s" % taglib)
143             parser.add_library(lib)
144         except InvalidTemplateLibrary, e:
145+            import traceback
146+            traceback.print_exc()
147             raise TemplateSyntaxError, "'%s' is not a valid tag library: %s" % (taglib, e)
148     return LoadNode()
149 load = register.tag(load)