mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-11 15:34:15 +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:
0
InvenTree/plugin/builtin/labels/__init__.py
Normal file
0
InvenTree/plugin/builtin/labels/__init__.py
Normal file
96
InvenTree/plugin/builtin/labels/inventree_label.py
Normal file
96
InvenTree/plugin/builtin/labels/inventree_label.py
Normal file
@ -0,0 +1,96 @@
|
||||
"""Default label printing plugin (supports PDF generation)"""
|
||||
|
||||
from django.core.files.base import ContentFile
|
||||
from django.http import JsonResponse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from label.models import LabelOutput, LabelTemplate
|
||||
from plugin import InvenTreePlugin
|
||||
from plugin.mixins import LabelPrintingMixin, SettingsMixin
|
||||
|
||||
|
||||
class InvenTreeLabelPlugin(LabelPrintingMixin, SettingsMixin, InvenTreePlugin):
|
||||
"""Builtin plugin for label printing.
|
||||
|
||||
This plugin merges the selected labels into a single PDF file,
|
||||
which is made available for download.
|
||||
"""
|
||||
|
||||
NAME = "InvenTreeLabel"
|
||||
TITLE = _("InvenTree PDF label printer")
|
||||
DESCRIPTION = _("Provides native support for printing PDF labels")
|
||||
VERSION = "1.0.0"
|
||||
AUTHOR = _("InvenTree contributors")
|
||||
|
||||
BLOCKING_PRINT = True
|
||||
|
||||
SETTINGS = {
|
||||
'DEBUG': {
|
||||
'name': _('Debug mode'),
|
||||
'description': _('Enable debug mode - returns raw HTML instead of PDF'),
|
||||
'validator': bool,
|
||||
'default': False,
|
||||
},
|
||||
}
|
||||
|
||||
def print_labels(self, label: LabelTemplate, items: list, request, **kwargs):
|
||||
"""Handle printing of multiple labels
|
||||
|
||||
- Label outputs are concatenated together, and we return a single PDF file.
|
||||
- If DEBUG mode is enabled, we return a single HTML file.
|
||||
"""
|
||||
|
||||
debug = self.get_setting('DEBUG')
|
||||
|
||||
outputs = []
|
||||
output_file = None
|
||||
|
||||
for item in items:
|
||||
|
||||
label.object_to_print = item
|
||||
|
||||
outputs.append(self.print_label(label, request, debug=debug, **kwargs))
|
||||
|
||||
if self.get_setting('DEBUG'):
|
||||
html = '\n'.join(outputs)
|
||||
|
||||
output_file = ContentFile(html, 'labels.html')
|
||||
else:
|
||||
pages = []
|
||||
|
||||
# Following process is required to stitch labels together into a single PDF
|
||||
for output in outputs:
|
||||
doc = output.get_document()
|
||||
|
||||
for page in doc.pages:
|
||||
pages.append(page)
|
||||
|
||||
pdf = outputs[0].get_document().copy(pages).write_pdf()
|
||||
|
||||
# Create label output file
|
||||
output_file = ContentFile(pdf, 'labels.pdf')
|
||||
|
||||
# Save the generated file to the database
|
||||
output = LabelOutput.objects.create(
|
||||
label=output_file,
|
||||
user=request.user
|
||||
)
|
||||
|
||||
return JsonResponse({
|
||||
'file': output.label.url,
|
||||
'success': True,
|
||||
'message': f'{len(items)} labels generated'
|
||||
})
|
||||
|
||||
def print_label(self, label: LabelTemplate, request, **kwargs):
|
||||
"""Handle printing of a single label.
|
||||
|
||||
Returns either a PDF or HTML output, depending on the DEBUG setting.
|
||||
"""
|
||||
|
||||
debug = kwargs.get('debug', self.get_setting('DEBUG'))
|
||||
|
||||
if debug:
|
||||
return self.render_to_html(label, request, **kwargs)
|
||||
else:
|
||||
return self.render_to_pdf(label, request, **kwargs)
|
Reference in New Issue
Block a user