diff --git a/docs/docs/extend/plugins/ui.md b/docs/docs/extend/plugins/ui.md index 33b58faabe..1603687842 100644 --- a/docs/docs/extend/plugins/ui.md +++ b/docs/docs/extend/plugins/ui.md @@ -18,9 +18,9 @@ When rendering certain content in the user interface, the rendering functions ar ## Custom Panels -Many of the pages in the InvenTree web interface are built using a series of "panels" which are displayed on the page. Custom panels can be added to these pages, by implementing the `get_custom_panels` method: +Many of the pages in the InvenTree web interface are built using a series of "panels" which are displayed on the page. Custom panels can be added to these pages, by implementing the `get_ui_panels` method: -::: plugin.base.integration.UserInterfaceMixin.UserInterfaceMixin.get_custom_panels +::: plugin.base.integration.UserInterfaceMixin.UserInterfaceMixin.get_ui_panels options: show_bases: False show_root_heading: False diff --git a/src/backend/InvenTree/plugin/api.py b/src/backend/InvenTree/plugin/api.py index a8a9cb1c48..4b2172929b 100644 --- a/src/backend/InvenTree/plugin/api.py +++ b/src/backend/InvenTree/plugin/api.py @@ -19,6 +19,7 @@ import plugin.serializers as PluginSerializers from common.api import GlobalSettingsPermissions from common.settings import get_global_setting from InvenTree.api import MetadataView +from InvenTree.exceptions import log_error from InvenTree.filters import SEARCH_ORDER_FILTER from InvenTree.mixins import ( CreateAPI, @@ -433,17 +434,22 @@ class PluginPanelList(APIView): if get_global_setting('ENABLE_PLUGINS_INTERFACE'): # Extract all plugins from the registry which provide custom panels for _plugin in registry.with_mixin('ui', active=True): - # Allow plugins to fill this data out - plugin_panels = _plugin.get_custom_panels( - target_model, target_id, request - ) + try: + # Allow plugins to fill this data out + plugin_panels = _plugin.get_ui_panels( + target_model, target_id, request + ) - if plugin_panels and type(plugin_panels) is list: - for panel in plugin_panels: - panel['plugin'] = _plugin.slug + if plugin_panels and type(plugin_panels) is list: + for panel in plugin_panels: + panel['plugin'] = _plugin.slug - # TODO: Validate each panel before inserting - panels.append(panel) + # TODO: Validate each panel before inserting + panels.append(panel) + except Exception: + # Custom panels could not load + # Log the error and continue + log_error(f'{_plugin.slug}.get_ui_panels') return Response(PluginSerializers.PluginPanelSerializer(panels, many=True).data) diff --git a/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py b/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py index 252c18705b..7c70dd2c4e 100644 --- a/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py @@ -34,6 +34,10 @@ class UserInterfaceMixin: - All content is accessed via the API, as requested by the user interface. - This means that content can be dynamically generated, based on the current state of the system. + + The following custom UI methods are available: + - get_ui_panels: Return a list of custom panels to be injected into the UI + """ class MixinMeta: @@ -46,8 +50,8 @@ class UserInterfaceMixin: super().__init__() self.add_mixin('ui', True, __class__) - def get_custom_panels( - self, instance_type: str, instance_id: int, request: Request + def get_ui_panels( + self, instance_type: str, instance_id: int, request: Request, **kwargs ) -> list[CustomPanel]: """Return a list of custom panels to be injected into the UI. diff --git a/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py index 5b0fbf2f77..deaa655e24 100644 --- a/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py +++ b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py @@ -44,7 +44,7 @@ class SampleUserInterfacePlugin(SettingsMixin, UserInterfaceMixin, InvenTreePlug }, } - def get_custom_panels(self, instance_type: str, instance_id: int, request): + def get_ui_panels(self, instance_type: str, instance_id: int, request, **kwargs): """Return a list of custom panels to be injected into the UI.""" panels = []