From 8088bf28fe51d7e416764c7031149bbf95ba37d6 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 10 Jan 2022 00:40:19 +0100 Subject: [PATCH] refactor ActionPlugin to use mixin --- InvenTree/plugin/action.py | 67 +++-------------- InvenTree/plugin/builtin/action/mixins.py | 73 +++++++++++++++++++ .../plugin/builtin/integration/mixins.py | 72 ++++++++++++++++++ InvenTree/plugin/mixins/__init__.py | 2 + 4 files changed, 157 insertions(+), 57 deletions(-) create mode 100644 InvenTree/plugin/builtin/action/mixins.py diff --git a/InvenTree/plugin/action.py b/InvenTree/plugin/action.py index 5e36c22e74..d0aee38230 100644 --- a/InvenTree/plugin/action.py +++ b/InvenTree/plugin/action.py @@ -2,69 +2,22 @@ """Class for ActionPlugin""" import logging +import warnings import plugin.plugin as plugin +from plugin.builtin.action.mixins import ActionMixin +import plugin.integration logger = logging.getLogger("inventree") -class ActionPlugin(plugin.InvenTreePlugin): +class ActionPlugin(ActionMixin, plugin.integration.IntegrationPluginBase): """ - The ActionPlugin class is used to perform custom actions + Legacy action definition - will be replaced + Please use the new Integration Plugin API and the Action mixin """ - - ACTION_NAME = "" - - @classmethod - def action_name(cls): - """ - Return the action name for this plugin. - If the ACTION_NAME parameter is empty, - look at the PLUGIN_NAME instead. - """ - action = cls.ACTION_NAME - - if not action: - action = cls.PLUGIN_NAME - - return action - - def __init__(self, user, data=None): - """ - An action plugin takes a user reference, and an optional dataset (dict) - """ - plugin.InvenTreePlugin.__init__(self) - - self.user = user - self.data = data - - def perform_action(self): - """ - Override this method to perform the action! - """ - - def get_result(self): - """ - Result of the action? - """ - - # Re-implement this for cutsom actions - return False - - def get_info(self): - """ - Extra info? Can be a string / dict / etc - """ - return None - - def get_response(self): - """ - Return a response. Default implementation is a simple response - which can be overridden. - """ - return { - "action": self.action_name(), - "result": self.get_result(), - "info": self.get_info(), - } + def __init__(self, user=None, data=None): + warnings.warn("using the ActionPlugin is depreceated", DeprecationWarning) + super().__init__() + self.init(user, data) diff --git a/InvenTree/plugin/builtin/action/mixins.py b/InvenTree/plugin/builtin/action/mixins.py new file mode 100644 index 0000000000..1f9b34c661 --- /dev/null +++ b/InvenTree/plugin/builtin/action/mixins.py @@ -0,0 +1,73 @@ +""" +Plugin mixin classes for action plugin +""" + +class ActionMixin: + """ + Mixin that enables custom actions + """ + ACTION_NAME = "" + + class MixinMeta: + """ + meta options for this mixin + """ + MIXIN_NAME = 'Actions' + + def __init__(self): + super().__init__() + self.add_mixin('action', 'has_action', __class__) + + @property + def has_action(self): + """ + Does this plugin have everything needed for an action? + """ + return True + + def action_name(self): + """ + Return the action name for this plugin. + If the ACTION_NAME parameter is empty, + look at the PLUGIN_NAME instead. + """ + if self.ACTION_NAME: + return self.ACTION_NAME + return self.name + + def init(self, user, data=None): + """ + An action plugin takes a user reference, and an optional dataset (dict) + """ + self.user = user + self.data = data + + def perform_action(self): + """ + Override this method to perform the action! + """ + + def get_result(self): + """ + Result of the action? + """ + + # Re-implement this for cutsom actions + return False + + def get_info(self): + """ + Extra info? Can be a string / dict / etc + """ + return None + + def get_response(self): + """ + Return a response. Default implementation is a simple response + which can be overridden. + """ + return { + "action": self.action_name(), + "result": self.get_result(), + "info": self.get_info(), + } diff --git a/InvenTree/plugin/builtin/integration/mixins.py b/InvenTree/plugin/builtin/integration/mixins.py index c6198ed7a1..14997fd452 100644 --- a/InvenTree/plugin/builtin/integration/mixins.py +++ b/InvenTree/plugin/builtin/integration/mixins.py @@ -301,3 +301,75 @@ class AppMixin: this plugin is always an app with this plugin """ return True + + +class ActionMixin: + """ + Mixin that enables custom actions + """ + ACTION_NAME = "" + + class MixinMeta: + """ + meta options for this mixin + """ + MIXIN_NAME = 'Action' + + def __init__(self): + super().__init__() + self.add_mixin('action', 'has_action', __class__) + + @property + def has_action(self): + """ + Does this plugin have everything needed for an action? + """ + return True + + @property + def action_name(self): + """ + Return the action name for this plugin. + If the ACTION_NAME parameter is empty, + look at the PLUGIN_NAME instead. + """ + if self.ACTION_NAME: + return self.ACTION_NAME + return self.name + + def init(self, user, data=None): + """ + An action plugin takes a user reference, and an optional dataset (dict) + """ + self.user = user + self.data = data + + def perform_action(self): + """ + Override this method to perform the action! + """ + + def get_result(self): + """ + Result of the action? + """ + + # Re-implement this for custom actions + return False + + def get_info(self): + """ + Extra info? Can be a string / dict / etc + """ + return None + + def get_response(self): + """ + Return a response. Default implementation is a simple response + which can be overridden. + """ + return { + "action": self.action_name(), + "result": self.get_result(), + "info": self.get_info(), + } diff --git a/InvenTree/plugin/mixins/__init__.py b/InvenTree/plugin/mixins/__init__.py index e9c910bb9e..389258a99a 100644 --- a/InvenTree/plugin/mixins/__init__.py +++ b/InvenTree/plugin/mixins/__init__.py @@ -3,6 +3,7 @@ Utility class to enable simpler imports """ from ..builtin.integration.mixins import AppMixin, SettingsMixin, ScheduleMixin, UrlsMixin, NavigationMixin +from ..builtin.action.mixins import ActionMixin __all__ = [ 'AppMixin', @@ -10,4 +11,5 @@ __all__ = [ 'ScheduleMixin', 'SettingsMixin', 'UrlsMixin', + 'ActionMixin', ]