Pluggable InputTypes use edxmako.paths.add_lookup to inject new mako template directories. Those were getting clobbered by microsites (and by theming), which were completely rebuilding the mako template lookup list from scratch. This commit switches those two features to use the same add_lookup function as pluggable InputTypes. [LMS-2489]
62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
"""
|
|
Set up lookup paths for mako templates.
|
|
"""
|
|
import os
|
|
import pkg_resources
|
|
|
|
from django.conf import settings
|
|
from mako.lookup import TemplateLookup
|
|
|
|
from . import LOOKUP
|
|
|
|
|
|
class DynamicTemplateLookup(TemplateLookup):
|
|
"""
|
|
A specialization of the standard mako `TemplateLookup` class which allows
|
|
for adding directories progressively.
|
|
"""
|
|
def add_directory(self, directory, prepend=False):
|
|
"""
|
|
Add a new directory to the template lookup path.
|
|
"""
|
|
if prepend:
|
|
self.directories.insert(0, os.path.normpath(directory))
|
|
else:
|
|
self.directories.append(os.path.normpath(directory))
|
|
|
|
|
|
def clear_lookups(namespace):
|
|
"""
|
|
Remove mako template lookups for the given namespace.
|
|
"""
|
|
if namespace in LOOKUP:
|
|
del LOOKUP[namespace]
|
|
|
|
def add_lookup(namespace, directory, package=None, prepend=False):
|
|
"""
|
|
Adds a new mako template lookup directory to the given namespace.
|
|
|
|
If `package` is specified, `pkg_resources` is used to look up the directory
|
|
inside the given package. Otherwise `directory` is assumed to be a path
|
|
in the filesystem.
|
|
"""
|
|
templates = LOOKUP.get(namespace)
|
|
if not templates:
|
|
LOOKUP[namespace] = templates = DynamicTemplateLookup(
|
|
module_directory=settings.MAKO_MODULE_DIR,
|
|
output_encoding='utf-8',
|
|
input_encoding='utf-8',
|
|
default_filters=['decode.utf8'],
|
|
encoding_errors='replace',
|
|
)
|
|
if package:
|
|
directory = pkg_resources.resource_filename(package, directory)
|
|
templates.add_directory(directory, prepend=prepend)
|
|
|
|
|
|
def lookup_template(namespace, name):
|
|
"""
|
|
Look up a Mako template by namespace and name.
|
|
"""
|
|
return LOOKUP[namespace].get_template(name)
|