Code

Ticket #2539: template_02.diff

File template_02.diff, 5.7 KB (added by limodou, 8 years ago)

move rsplit to rindex and reduce duplicate path entry in path

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