# coding:utf-8 ''' Created on 2009-12-30 @author: Jason Green @author-email: guileen@gmail.com ''' from jinja2 import Environment from django.conf import settings def _new_env(env_class): from jinja2 import PackageLoader, ChoiceLoader, FileSystemLoader loader_array = [] for pth in getattr(settings, 'TEMPLATE_DIRS', ()): loader_array.append(FileSystemLoader(pth)) for app in settings.INSTALLED_APPS: loader_array.append(PackageLoader(app)) # Setup environment global_exts = getattr(settings, 'JINJA_EXTS', ()) env = object.__new__(env_class) env_class.__init__(env,extensions=global_exts, loader=ChoiceLoader(loader_array)) return env def _init_env(env): from django.core.urlresolvers import get_callable from django.utils import translation global_exts = getattr(settings, 'JINJA_EXTS', ()) if 'jinja2.ext.i18n' in global_exts: env.install_gettext_translations(translation) # Add user Globals, Filters, Tests global_imports = getattr(settings, 'JINJA_GLOBALS', ()) for imp in global_imports: method = get_callable(imp) method_name = getattr(method,'jinja_name',None) if not method_name == None: env.globals[method_name] = method else: env.globals[method.__name__] = method env.globals['settings'] = settings env.globals['get_language'] = translation.get_language env.globals['get_language_bidi'] = translation.get_language_bidi import datetime env.globals['datetime'] = datetime global_filters = getattr(settings, 'JINJA_FILTERS', ()) for imp in global_filters: method = get_callable(imp) method_name = getattr(method,'jinja_name',None) if not method_name == None: env.filters[method_name] = method else: env.filters[method.__name__] = method global_tests = getattr(settings, 'JINJA_TESTS', ()) for imp in global_tests: method = get_callable(imp) method_name = getattr(method,'jinja_name',None) if not method_name == None: env.tests[method_name] = method else: env.tests[method.__name__] = method def install(env=Environment): if(isinstance(env,type) and (env==Environment or issubclass(env,Environment))): env = _new_env(env) _init_env(env) #override jinja2.Template.render from jinja2 import Template from django.template.context import Context _raw_render = Template.render def _new_render(self, *args, **kwargs): if(len(args)>0 and isinstance(args[0],Context)): c = {} for d in args[0].dicts: c.update(d) return _raw_render(self,c) return _raw_render(self, *args, **kwargs) Template.render = _new_render #override djloader.get_template import django.template.loader as djloader from django.template.loader import get_template as _original_get_template def get_template(template_name): for skip_path in getattr(settings, 'KEEP_DJANGO_TEMPLATES', ()): if template_name.startswith(skip_path): return _original_get_template(template_name) return env.get_template(template_name) djloader.get_template = get_template