From 103921f5c47e00d7a4da8c0a77b9ca4084789355 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 7 May 2022 19:59:59 +1000 Subject: [PATCH] Rename plugin.loader to plugin.template - Add helper function for rendering a template --- InvenTree/InvenTree/settings.py | 2 +- InvenTree/plugin/loader.py | 19 ---------- InvenTree/plugin/template.py | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 20 deletions(-) delete mode 100644 InvenTree/plugin/loader.py create mode 100644 InvenTree/plugin/template.py diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 5d0aea35e3..3012cdc61f 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -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', ]) diff --git a/InvenTree/plugin/loader.py b/InvenTree/plugin/loader.py deleted file mode 100644 index 538bd2358b..0000000000 --- a/InvenTree/plugin/loader.py +++ /dev/null @@ -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) diff --git a/InvenTree/plugin/template.py b/InvenTree/plugin/template.py new file mode 100644 index 0000000000..7e1da81609 --- /dev/null +++ b/InvenTree/plugin/template.py @@ -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""" +
+ Template file {template_file} does not exist. +
+ """ + + # Render with the provided context + html = tmp.render(context) + + return html