mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-06 05:30:56 +00:00
Label plugin refactor (#5251)
* Add skeleton for builtin label printing plugin * Force selection of plugin when printing labels * Enhance LabelPrintingMixin class - Add render_to_pdf method - Add render_to_html method * Enhance plugin mixin - Add class attribute to select blocking or non-blocking printing - Add render_to_png method - Add default method for printing multiple labels - Add method for offloding print job * Simplify print_label background function - All arguments now handled by specific plugin * Simplify label printing API - Simply pass data to the particular plugin - Check result type - Return result * Updated sample plugin * Working on client side code * Cleanup * Update sample plugin * Add new model type - LabelOutput model - Stores generated label file to the database - Makes available for download * Update label printing plugin mixin * Add background task to remove any old label outputs * Open file if response contains filename * Remove "default printer" option which does not specify a plugin * Delete old labels after 5 days * Remove debug statements * Update API version * Changed default behaviour to background printing * Update label plugin mixin docs * Provide default printer if none provided (legacy) * Update unit test * unit test updates * Further fixes for unit tests * unit test updates
This commit is contained in:
@ -5,30 +5,26 @@ import logging
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
import pdf2image
|
||||
|
||||
import common.notifications
|
||||
from common.models import InvenTreeSetting
|
||||
from InvenTree.exceptions import log_error
|
||||
from plugin.registry import registry
|
||||
|
||||
logger = logging.getLogger('inventree')
|
||||
|
||||
|
||||
def print_label(plugin_slug: str, pdf_data, filename=None, label_instance=None, user=None):
|
||||
def print_label(plugin_slug: str, **kwargs):
|
||||
"""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.
|
||||
|
||||
Args:
|
||||
Arguments:
|
||||
plugin_slug (str): The unique slug (key) of the plugin.
|
||||
pdf_data: Binary PDF data.
|
||||
filename: The intended name of the printed label. Defaults to None.
|
||||
label_instance (Union[LabelTemplate, None], optional): The template instance that should be printed. Defaults to None.
|
||||
user (Union[User, None], optional): User that should be informed of errors. Defaults to None.
|
||||
|
||||
kwargs:
|
||||
passed through to the plugin.print_label() method
|
||||
"""
|
||||
logger.info(f"Plugin '{plugin_slug}' is printing a label '{filename}'")
|
||||
logger.info(f"Plugin '{plugin_slug}' is printing a label")
|
||||
|
||||
plugin = registry.get_plugin(plugin_slug)
|
||||
|
||||
@ -36,43 +32,30 @@ def print_label(plugin_slug: str, pdf_data, filename=None, label_instance=None,
|
||||
logger.error(f"Could not find matching plugin for '{plugin_slug}'")
|
||||
return
|
||||
|
||||
# In addition to providing a .pdf image, we'll also provide a .png file
|
||||
dpi = InvenTreeSetting.get_setting('LABEL_DPI', 300)
|
||||
png_file = pdf2image.convert_from_bytes(
|
||||
pdf_data,
|
||||
dpi=dpi,
|
||||
)[0]
|
||||
|
||||
try:
|
||||
plugin.print_label(
|
||||
pdf_data=pdf_data,
|
||||
png_file=png_file,
|
||||
filename=filename,
|
||||
label_instance=label_instance,
|
||||
width=label_instance.width,
|
||||
height=label_instance.height,
|
||||
user=user
|
||||
)
|
||||
plugin.print_label(**kwargs)
|
||||
except Exception as e: # pragma: no cover
|
||||
# Plugin threw an error - notify the user who attempted to print
|
||||
|
||||
ctx = {
|
||||
'name': _('Label printing failed'),
|
||||
'message': str(e),
|
||||
}
|
||||
|
||||
# Log an error message to the database
|
||||
log_error('plugin.print_label')
|
||||
logger.error(f"Label printing failed: Sending notification to user '{user}'") # pragma: no cover
|
||||
user = kwargs.get('user', None)
|
||||
|
||||
# Throw an error against the plugin instance
|
||||
common.notifications.trigger_notification(
|
||||
plugin.plugin_config(),
|
||||
'label.printing_failed',
|
||||
targets=[user],
|
||||
context=ctx,
|
||||
delivery_methods={common.notifications.UIMessageNotification, },
|
||||
)
|
||||
if user:
|
||||
# Log an error message to the database
|
||||
log_error('plugin.print_label')
|
||||
logger.error(f"Label printing failed: Sending notification to user '{user}'") # pragma: no cover
|
||||
|
||||
# Throw an error against the plugin instance
|
||||
common.notifications.trigger_notification(
|
||||
plugin.plugin_config(),
|
||||
'label.printing_failed',
|
||||
targets=[user],
|
||||
context=ctx,
|
||||
delivery_methods={common.notifications.UIMessageNotification, },
|
||||
)
|
||||
|
||||
if settings.TESTING:
|
||||
# If we are in testing mode, we want to know about this exception
|
||||
|
Reference in New Issue
Block a user