Rename plugin.loader to plugin.template

- Add helper function for rendering a template
This commit is contained in:
Oliver Walters 2022-05-07 19:59:59 +10:00
parent 44c4e88646
commit 103921f5c4
3 changed files with 67 additions and 20 deletions

View File

@ -343,7 +343,7 @@ TEMPLATES = [
],
'loaders': [(
'django.template.loaders.cached.Loader', [
'plugin.loader.PluginTemplateLoader',
'plugin.template.PluginTemplateLoader',
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
])

View File

@ -1,19 +0,0 @@
"""
load templates for loaded plugins
"""
from django.template.loaders.filesystem import Loader as FilesystemLoader
from pathlib import Path
from plugin import registry
class PluginTemplateLoader(FilesystemLoader):
def get_dirs(self):
dirname = 'templates'
template_dirs = []
for plugin in registry.plugins.values():
new_path = Path(plugin.path) / dirname
if Path(new_path).is_dir():
template_dirs.append(new_path) # pragma: no cover
return tuple(template_dirs)

View File

@ -0,0 +1,66 @@
"""
load templates for loaded plugins
"""
import logging
from pathlib import Path
from django import template
from django.template.loaders.filesystem import Loader as FilesystemLoader
from plugin import registry
logger = logging.getLogger('inventree')
class PluginTemplateLoader(FilesystemLoader):
"""
A custom template loader which allows loading of templates from installed plugins.
Each plugin can register templates simply by providing a 'templates' directory in its root path.
The convention is that each 'templates' directory contains a subdirectory with the same name as the plugin,
e.g. templates/myplugin/my_template.html
In this case, the template can then be loaded (from any plugin!) by loading "myplugin/my_template.html".
The separate plugin-named directories help keep the templates separated and uniquely identifiable.
"""
def get_dirs(self):
dirname = 'templates'
template_dirs = []
for plugin in registry.plugins.values():
new_path = Path(plugin.path) / dirname
if Path(new_path).is_dir():
template_dirs.append(new_path) # pragma: no cover
return tuple(template_dirs)
def render_template(plugin, template_file, context=None):
"""
Locate and render a template file, available in the global template context.
"""
print("render_template", "->", template_file)
print("Context:")
print(context)
try:
tmp = template.loader.get_template(template_file)
except template.TemplateDoesNotExist:
logger.error(f"Plugin {plugin.slug} could not locate template '{template_file}'")
return f"""
<div class='alert alert-block alert-danger'>
Template file <em>{template_file}</em> does not exist.
</div>
"""
# Render with the provided context
html = tmp.render(context)
return html