diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index c7a824d8c8..cb4b939157 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -156,7 +156,7 @@ class LabelPrintMixin: # Offload a background task to print the provided label offload_task( - 'plugin.events.print_label', + 'plugin.base.label.label.print_label', plugin.plugin_slug(), image, label_instance=label_instance, diff --git a/InvenTree/plugin/base/event/events.py b/InvenTree/plugin/base/event/events.py index eb94f3b0e2..e23fc7fbdc 100644 --- a/InvenTree/plugin/base/event/events.py +++ b/InvenTree/plugin/base/event/events.py @@ -14,8 +14,6 @@ from django.db import transaction from django.db.models.signals import post_save, post_delete from django.dispatch.dispatcher import receiver -import common.notifications - from InvenTree.ready import canAppAccessDatabase, isImportingData from InvenTree.tasks import offload_task @@ -194,46 +192,3 @@ def after_delete(sender, instance, **kwargs): f'{table}.deleted', model=sender.__name__, ) - - -def print_label(plugin_slug, label_image, label_instance=None, user=None): - """ - Print label with the provided plugin. - - This task is nominally handled by the background worker. - - If the printing fails (throws an exception) then the user is notified. - - Arguments: - plugin_slug: The unique slug (key) of the plugin - label_image: A PIL.Image image object to be printed - """ - - logger.info(f"Plugin '{plugin_slug}' is printing a label") - - plugin = registry.plugins.get(plugin_slug, None) - - if plugin is None: - logger.error(f"Could not find matching plugin for '{plugin_slug}'") - return - - try: - plugin.print_label(label_image, width=label_instance.width, height=label_instance.height) - except Exception as e: - # Plugin threw an error - notify the user who attempted to print - - ctx = { - 'name': _('Label printing failed'), - 'message': str(e), - } - - logger.error(f"Label printing failed: Sending notification to user '{user}'") - - # Throw an error against the plugin instance - common.notifications.trigger_notifaction( - plugin.plugin_config(), - 'label.printing_failed', - targets=[user], - context=ctx, - delivery_methods=[common.notifications.UIMessageNotification] - ) diff --git a/InvenTree/plugin/base/label/__init__.py b/InvenTree/plugin/base/label/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/InvenTree/plugin/base/label/label.py b/InvenTree/plugin/base/label/label.py new file mode 100644 index 0000000000..52e0b57c1e --- /dev/null +++ b/InvenTree/plugin/base/label/label.py @@ -0,0 +1,52 @@ +"""Functions to print a label to a mixin printer""" +import logging + +from django.utils.translation import gettext_lazy as _ + +from plugin.registry import registry + + +logger = logging.getLogger('inventree') + + +def print_label(plugin_slug, label_image, label_instance=None, user=None): + """ + Print label with the provided plugin. + + This task is nominally handled by the background worker. + + If the printing fails (throws an exception) then the user is notified. + + Arguments: + plugin_slug: The unique slug (key) of the plugin + label_image: A PIL.Image image object to be printed + """ + + logger.info(f"Plugin '{plugin_slug}' is printing a label") + + plugin = registry.plugins.get(plugin_slug, None) + + if plugin is None: + logger.error(f"Could not find matching plugin for '{plugin_slug}'") + return + + try: + plugin.print_label(label_image, width=label_instance.width, height=label_instance.height) + except Exception as e: + # Plugin threw an error - notify the user who attempted to print + + ctx = { + 'name': _('Label printing failed'), + 'message': str(e), + } + + logger.error(f"Label printing failed: Sending notification to user '{user}'") + + # Throw an error against the plugin instance + common.notifications.trigger_notifaction( + plugin.plugin_config(), + 'label.printing_failed', + targets=[user], + context=ctx, + delivery_methods=[common.notifications.UIMessageNotification] + ) diff --git a/InvenTree/plugin/base/label/mixins.py b/InvenTree/plugin/base/label/mixins.py new file mode 100644 index 0000000000..1e7b67dd3f --- /dev/null +++ b/InvenTree/plugin/base/label/mixins.py @@ -0,0 +1,37 @@ +"""Plugin mixin classes for label plugins""" + + +class LabelPrintingMixin: + """ + Mixin which enables direct printing of stock labels. + + Each plugin must provide a NAME attribute, which is used to uniquely identify the printer. + + The plugin must also implement the print_label() function + """ + + class MixinMeta: + """ + Meta options for this mixin + """ + MIXIN_NAME = 'Label printing' + + def __init__(self): # pragma: no cover + super().__init__() + self.add_mixin('labels', True, __class__) + + def print_label(self, label, **kwargs): + """ + Callback to print a single label + + Arguments: + label: A black-and-white pillow Image object + + kwargs: + length: The length of the label (in mm) + width: The width of the label (in mm) + + """ + + # Unimplemented (to be implemented by the particular plugin class) + ... # pragma: no cover diff --git a/InvenTree/plugin/mixins/__init__.py b/InvenTree/plugin/mixins/__init__.py index aac3b2b6d2..de8ad4bc03 100644 --- a/InvenTree/plugin/mixins/__init__.py +++ b/InvenTree/plugin/mixins/__init__.py @@ -2,13 +2,14 @@ Utility class to enable simpler imports """ -from ..base.integration.mixins import APICallMixin, AppMixin, LabelPrintingMixin, SettingsMixin, ScheduleMixin, UrlsMixin, NavigationMixin, PanelMixin +from ..base.integration.mixins import APICallMixin, AppMixin, SettingsMixin, ScheduleMixin, UrlsMixin, NavigationMixin, PanelMixin from common.notifications import SingleNotificationMethod, BulkNotificationMethod from ..base.action.mixins import ActionMixin from ..base.barcodes.mixins import BarcodeMixin from ..base.event.mixins import EventMixin +from ..base.label.mixins import LabelPrintingMixin __all__ = [ 'APICallMixin',