mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +00:00 
			
		
		
		
	Rename plugin.loader to plugin.template
- Add helper function for rendering a template
This commit is contained in:
		@@ -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',
 | 
			
		||||
                ])
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
							
								
								
									
										66
									
								
								InvenTree/plugin/template.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								InvenTree/plugin/template.py
									
									
									
									
									
										Normal 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
 | 
			
		||||
		Reference in New Issue
	
	Block a user