mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Report Plugins (#4643)
* Add plugin mixin class for extending reports * Expose report context to the plugin system * Add an example mixin for adding context data to a report * Add the 'request' object to the plugin code
This commit is contained in:
		
							
								
								
									
										35
									
								
								InvenTree/plugin/base/integration/ReportMixin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								InvenTree/plugin/base/integration/ReportMixin.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| """Plugin mixin class for ReportContextMixin""" | ||||
|  | ||||
|  | ||||
| class ReportMixin: | ||||
|     """Mixin which provides additional context to generated reports. | ||||
|  | ||||
|     This plugin mixin acts as a "shim" when generating reports, | ||||
|     can can add extra context data to a report template. | ||||
|  | ||||
|     Useful for custom report generation where the report template | ||||
|     needs some extra information which is not provided by default, | ||||
|     or some complex logic to generate the report. | ||||
|     """ | ||||
|  | ||||
|     class MixinMeta: | ||||
|         """Meta options for this mixin.""" | ||||
|  | ||||
|         MIXIN_NAME = 'ReportContext' | ||||
|  | ||||
|     def __init__(self): | ||||
|         """Register mixin.""" | ||||
|         super().__init__() | ||||
|         self.add_mixin('report', True, __class__) | ||||
|  | ||||
|     def add_report_context(self, instance, request, context): | ||||
|         """Add extra context to the provided report instance. | ||||
|  | ||||
|         By default, this method does nothing. | ||||
|  | ||||
|         Args: | ||||
|             instance: The report instance to add context to | ||||
|             request: The request object which initiated the report generation | ||||
|             context: The context dictionary to add to | ||||
|         """ | ||||
|         pass | ||||
| @@ -10,6 +10,7 @@ from ..base.integration.AppMixin import AppMixin | ||||
| from ..base.integration.mixins import (APICallMixin, NavigationMixin, | ||||
|                                        PanelMixin, SettingsContentMixin, | ||||
|                                        ValidationMixin) | ||||
| from ..base.integration.ReportMixin import ReportMixin | ||||
| from ..base.integration.ScheduleMixin import ScheduleMixin | ||||
| from ..base.integration.SettingsMixin import SettingsMixin | ||||
| from ..base.integration.UrlsMixin import UrlsMixin | ||||
| @@ -22,6 +23,7 @@ __all__ = [ | ||||
|     'EventMixin', | ||||
|     'LabelPrintingMixin', | ||||
|     'NavigationMixin', | ||||
|     'ReportMixin', | ||||
|     'ScheduleMixin', | ||||
|     'SettingsContentMixin', | ||||
|     'SettingsMixin', | ||||
|   | ||||
| @@ -39,6 +39,7 @@ class PluginsRegistry: | ||||
|     from .base.integration.ScheduleMixin import ScheduleMixin | ||||
|     from .base.integration.SettingsMixin import SettingsMixin | ||||
|     from .base.integration.UrlsMixin import UrlsMixin | ||||
|  | ||||
|     DEFAULT_MIXIN_ORDER = [SettingsMixin, ScheduleMixin, AppMixin, UrlsMixin] | ||||
|  | ||||
|     def __init__(self, mixin_order: list = None) -> None: | ||||
|   | ||||
							
								
								
									
										38
									
								
								InvenTree/plugin/samples/integration/report_plugin_sample.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								InvenTree/plugin/samples/integration/report_plugin_sample.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| """Sample plugin for extending reporting functionality""" | ||||
|  | ||||
| import random | ||||
|  | ||||
| from plugin import InvenTreePlugin | ||||
| from plugin.mixins import ReportMixin | ||||
| from report.models import PurchaseOrderReport | ||||
|  | ||||
|  | ||||
| class SampleReportPlugin(ReportMixin, InvenTreePlugin): | ||||
|     """Sample plugin which provides extra context data to a report""" | ||||
|  | ||||
|     NAME = "Report Plugin" | ||||
|     SLUG = "reportexample" | ||||
|     TITLE = "Sample Report Plugin" | ||||
|     DESCRIPTION = "A sample plugin which provides extra context data to a report" | ||||
|     VERSION = "1.0" | ||||
|  | ||||
|     def some_custom_function(self): | ||||
|         """Some custom function which is not required for the plugin to function""" | ||||
|         return random.randint(0, 100) | ||||
|  | ||||
|     def add_report_context(self, instance, request, context): | ||||
|         """Add example content to the report instance""" | ||||
|  | ||||
|         # We can add any extra context data we want to the report | ||||
|  | ||||
|         # Generate a random string of data | ||||
|         context['random_text'] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=20)) | ||||
|  | ||||
|         # Call a custom method | ||||
|         context['random_int'] = self.some_custom_function() | ||||
|  | ||||
|         # We can also add extra data to the context which is specific to the report type | ||||
|         context['is_purchase_order'] = isinstance(instance, PurchaseOrderReport) | ||||
|  | ||||
|         # We can also use the 'request' object to add extra context data | ||||
|         context['request_method'] = request.method | ||||
| @@ -22,6 +22,7 @@ import part.models | ||||
| import stock.models | ||||
| from InvenTree.helpers import validateFilterString | ||||
| from InvenTree.models import MetadataMixin | ||||
| from plugin.registry import registry | ||||
|  | ||||
| try: | ||||
|     from django_weasyprint import WeasyTemplateResponseMixin | ||||
| @@ -212,6 +213,12 @@ class ReportTemplateBase(MetadataMixin, ReportBase): | ||||
|         context['request'] = request | ||||
|         context['user'] = request.user | ||||
|  | ||||
|         # Pass the context through to any active reporting plugins | ||||
|         plugins = registry.with_mixin('report') | ||||
|  | ||||
|         for plugin in plugins: | ||||
|             plugin.add_report_context(self, request, context) | ||||
|  | ||||
|         return context | ||||
|  | ||||
|     def generate_filename(self, request, **kwargs): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user