mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #6587 -- Removed nasty __path__ hacking in templatetag loading. Thanks to Øyvind Satvik and Andrew Badr for their work on this patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12295 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -309,12 +309,17 @@ def missing_docutils_page(request): | ||||
|  | ||||
| def load_all_installed_template_libraries(): | ||||
|     # Load/register all template tag libraries from installed apps. | ||||
|     for e in templatetags.__path__: | ||||
|         libraries = [os.path.splitext(p)[0] for p in os.listdir(e) if p.endswith('.py') and p[0].isalpha()] | ||||
|     for module_name in template.get_templatetags_modules(): | ||||
|         mod = import_module(module_name) | ||||
|         libraries = [ | ||||
|             os.path.splitext(p)[0] | ||||
|             for p in os.listdir(os.path.dirname(mod.__file__)) | ||||
|             if p.endswith('.py') and p[0].isalpha() | ||||
|         ] | ||||
|         for library_name in libraries: | ||||
|             try: | ||||
|                 lib = template.get_library("django.templatetags.%s" % library_name.split('.')[-1]) | ||||
|             except template.InvalidTemplateLibrary: | ||||
|                 lib = template.get_library(library_name) | ||||
|             except template.InvalidTemplateLibrary, e: | ||||
|                 pass | ||||
|  | ||||
| def get_return_data_type(func_name): | ||||
|   | ||||
| @@ -966,22 +966,70 @@ class Library(object): | ||||
|             return func | ||||
|         return dec | ||||
|  | ||||
| def get_library(module_name): | ||||
|     lib = libraries.get(module_name, None) | ||||
|     if not lib: | ||||
| def import_library(taglib_module): | ||||
|     """Load a template tag library module. | ||||
|  | ||||
|     Verifies that the library contains a 'register' attribute, and | ||||
|     returns that attribute as the representation of the library | ||||
|     """ | ||||
|     try: | ||||
|             mod = import_module(module_name) | ||||
|         except ImportError, e: | ||||
|             raise InvalidTemplateLibrary("Could not load template library from %s, %s" % (module_name, e)) | ||||
|         mod = import_module(taglib_module) | ||||
|     except ImportError: | ||||
|         return None | ||||
|     try: | ||||
|             lib = mod.register | ||||
|             libraries[module_name] = lib | ||||
|         return mod.register | ||||
|     except AttributeError: | ||||
|             raise InvalidTemplateLibrary("Template library %s does not have a variable named 'register'" % module_name) | ||||
|         raise InvalidTemplateLibrary("Template library %s does not have a variable named 'register'" % taglib_module) | ||||
|  | ||||
| templatetags_modules = [] | ||||
|  | ||||
| def get_templatetags_modules(): | ||||
|     """Return the list of all available template tag modules. | ||||
|  | ||||
|     Caches the result for faster access. | ||||
|     """ | ||||
|     global templatetags_modules | ||||
|     if not templatetags_modules: | ||||
|         _templatetags_modules = [] | ||||
|         # Populate list once per thread. | ||||
|         for app_module in ['django'] + list(settings.INSTALLED_APPS): | ||||
|             try: | ||||
|                 templatetag_module = '%s.templatetags' % app_module | ||||
|                 import_module(templatetag_module) | ||||
|                 _templatetags_modules.append(templatetag_module) | ||||
|             except ImportError: | ||||
|                 continue | ||||
|         templatetags_modules = _templatetags_modules | ||||
|     return templatetags_modules | ||||
|  | ||||
| def get_library(library_name): | ||||
|     """ | ||||
|     Load the template library module with the given name. | ||||
|  | ||||
|     If library is not already loaded loop over all templatetags modules to locate it. | ||||
|  | ||||
|     {% load somelib %} and {% load someotherlib %} loops twice. | ||||
|  | ||||
|     Subsequent loads eg. {% load somelib %} in the same process will grab the cached | ||||
|     module from libraries. | ||||
|     """ | ||||
|     lib = libraries.get(library_name, None) | ||||
|     if not lib: | ||||
|         templatetags_modules = get_templatetags_modules() | ||||
|         tried_modules = [] | ||||
|         for module in templatetags_modules: | ||||
|             taglib_module = '%s.%s' % (module, library_name) | ||||
|             tried_modules.append(taglib_module) | ||||
|             lib = import_library(taglib_module) | ||||
|             if lib: | ||||
|                 libraries[library_name] = lib | ||||
|                 break | ||||
|         if not lib: | ||||
|             raise InvalidTemplateLibrary("Template library %s not found, tried %s" % (library_name, ','.join(tried_modules))) | ||||
|     return lib | ||||
|  | ||||
| def add_to_builtins(module_name): | ||||
|     builtins.append(get_library(module_name)) | ||||
| def add_to_builtins(module): | ||||
|     builtins.append(import_library(module)) | ||||
|  | ||||
| add_to_builtins('django.template.defaulttags') | ||||
| add_to_builtins('django.template.defaultfilters') | ||||
|   | ||||
| @@ -920,7 +920,7 @@ def load(parser, token): | ||||
|     for taglib in bits[1:]: | ||||
|         # add the library to the parser | ||||
|         try: | ||||
|             lib = get_library("django.templatetags.%s" % taglib) | ||||
|             lib = get_library(taglib) | ||||
|             parser.add_library(lib) | ||||
|         except InvalidTemplateLibrary, e: | ||||
|             raise TemplateSyntaxError("'%s' is not a valid tag library: %s" % | ||||
|   | ||||
| @@ -1,8 +0,0 @@ | ||||
| from django.conf import settings | ||||
| from django.utils import importlib | ||||
|  | ||||
| for a in settings.INSTALLED_APPS: | ||||
|     try: | ||||
|         __path__.extend(importlib.import_module('.templatetags', a).__path__) | ||||
|     except ImportError: | ||||
|         pass | ||||
|   | ||||
| @@ -59,7 +59,7 @@ def do_echo(parser, token): | ||||
|  | ||||
| register.tag("echo", do_echo) | ||||
|  | ||||
| template.libraries['django.templatetags.testtags'] = register | ||||
| template.libraries['testtags'] = register | ||||
|  | ||||
| ##################################### | ||||
| # Helper objects for template tests # | ||||
|   | ||||
		Reference in New Issue
	
	Block a user