mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-04 07:05:41 +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': [(
 | 
					            'loaders': [(
 | 
				
			||||||
                'django.template.loaders.cached.Loader', [
 | 
					                'django.template.loaders.cached.Loader', [
 | 
				
			||||||
                    'plugin.loader.PluginTemplateLoader',
 | 
					                    'plugin.template.PluginTemplateLoader',
 | 
				
			||||||
                    'django.template.loaders.filesystem.Loader',
 | 
					                    'django.template.loaders.filesystem.Loader',
 | 
				
			||||||
                    'django.template.loaders.app_directories.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