From df99c3104a04bf185cba12ac3ac52551bbf955f7 Mon Sep 17 00:00:00 2001 From: Miklos Marton Date: Wed, 19 Jul 2023 22:08:58 +0200 Subject: [PATCH] Fixup after moving printing logic to plugins --- .../0013_add_multipage_to_buildlinelabel.py | 34 ++++++++++++ InvenTree/label/models.py | 36 ++++--------- .../plugin/builtin/labels/inventree_label.py | 53 +++++++++++++++++-- 3 files changed, 93 insertions(+), 30 deletions(-) create mode 100644 InvenTree/label/migrations/0013_add_multipage_to_buildlinelabel.py diff --git a/InvenTree/label/migrations/0013_add_multipage_to_buildlinelabel.py b/InvenTree/label/migrations/0013_add_multipage_to_buildlinelabel.py new file mode 100644 index 00000000000..3dc64af5b75 --- /dev/null +++ b/InvenTree/label/migrations/0013_add_multipage_to_buildlinelabel.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.20 on 2023-07-13 08:31 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('label', '0012_labeloutput'), + ] + + operations = [ + migrations.AddField( + model_name='buildlinelabel', + name='multipage', + field=models.BooleanField(default=False, verbose_name='Print multiple labels to a single page'), + ), + migrations.AddField( + model_name='buildlinelabel', + name='multipage_border', + field=models.CharField(blank=True, choices=[('0.5mm solid #000', 'Solid'), ('0.5mm dotted #000', 'Dotted'), ('', 'No border')], default='0.5mm solid #000', max_length=250, verbose_name='Border style'), + ), + migrations.AddField( + model_name='buildlinelabel', + name='page_height', + field=models.FloatField(default=297, help_text="The number of label rows per page will be automatically calculated from the label's height", validators=[django.core.validators.MinValueValidator(2)], verbose_name='Height of one page [mm]'), + ), + migrations.AddField( + model_name='buildlinelabel', + name='page_width', + field=models.FloatField(default=210, help_text="The number of label columns per page will be automatically calculated from the label's width", validators=[django.core.validators.MinValueValidator(2)], verbose_name='Width of one page [mm]'), + ), + ] diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py index db8f36a18bc..47058606e9f 100644 --- a/InvenTree/label/models.py +++ b/InvenTree/label/models.py @@ -244,6 +244,7 @@ def context(self, request): for plugin in plugins: # Let each plugin add its own context data plugin.add_label_context(self, self.object_to_print, request, context) + return context def context_multipage(self, request, content): @@ -290,17 +291,8 @@ def render(self, request, **kwargs): **kwargs ) - def render_multipage_as_string(self, request, multipage_table, **kwargs): - """Render the multipage tables to a HTML string with the multipage template. - - Useful for debug mode (viewing generated code) - """ - return render_to_string( - "label/multipage_label_base.html", - self.context_multipage(request, multipage_table), request) - - def render_multipage(self, request, multipage_table, **kwargs): - """Render the multipage tables to a HTML string with the multipage template. + def render_paginated(self, request, multipage_table, **kwargs): + """Render the multipage tables to an HTML string with the multipage template. Uses django-weasyprint plugin to render HTML template """ @@ -318,24 +310,14 @@ def render_multipage(self, request, multipage_table, **kwargs): ) return ret - def render_from_html(self, request, **kwargs): - """Render a pre-rendered HTML data to a PDF file. + def render_paginated_to_string(self, request, multipage_table, **kwargs): + """Render the multipage tables to a HTML string with the multipage template. - Uses django-weasyprint plugin to render HTML template + Useful for debug mode (viewing generated code) """ - wp = WeasyprintLabelMixin( - request, - self.template_name, - base_url=request.build_absolute_uri("/"), - presentational_hints=True, - filename=self.generate_filename(request), - **kwargs - ) - - return wp.render_to_response( - self.context(request), - **kwargs - ) + return render_to_string( + "label/multipage_label_base.html", + self.context_multipage(request, multipage_table), request) class LabelOutput(models.Model): diff --git a/InvenTree/plugin/builtin/labels/inventree_label.py b/InvenTree/plugin/builtin/labels/inventree_label.py index e90f0a5a679..37b39f0dd73 100644 --- a/InvenTree/plugin/builtin/labels/inventree_label.py +++ b/InvenTree/plugin/builtin/labels/inventree_label.py @@ -1,5 +1,7 @@ """Default label printing plugin (supports PDF generation)""" +import math + from django.core.files.base import ContentFile from django.http import JsonResponse from django.utils.translation import gettext_lazy as _ @@ -45,11 +47,14 @@ def print_labels(self, label: LabelTemplate, items: list, request, **kwargs): outputs = [] output_file = None - for item in items: + if label.multipage: + outputs = self.print_paginated(label, request, items, debug) + else: + for item in items: - label.object_to_print = item + label.object_to_print = item - outputs.append(self.print_label(label, request, debug=debug, **kwargs)) + outputs.append(self.print_label(label, request, debug=debug, **kwargs)) if self.get_setting('DEBUG'): html = '\n'.join(outputs) @@ -94,3 +99,45 @@ def print_label(self, label: LabelTemplate, request, **kwargs): return self.render_to_html(label, request, **kwargs) else: return self.render_to_pdf(label, request, **kwargs) + + def print_paginated(self, label: LabelTemplate, request, items, debug): + """Paginate the labels to pages depending on th label/page geometry ratio""" + + col_count = math.floor(label.page_width / label.width) + row_count = math.floor(label.page_height / label.height) + + main_tables = '' + + col_counter = 0 + row_counter = 0 + item_counter = 0 + + outputs = [] + + for item in items: + label.object_to_print = item + + main_tables += '' + + col_counter = col_counter + 1 + if col_counter >= col_count: + col_counter = 0 + main_tables += "" + + row_counter = row_counter + 1 + if row_counter >= row_count: + row_counter = 0 + main_tables += "
' + self.print_label(label, request, debug=True) + '
" + if item_counter < len(items) - 1: + main_tables += '' + else: + if item_counter < len(items) - 1: + main_tables += '' + item_counter = item_counter + 1 + + if debug: + outputs.append(label.render_paginated_to_string(request, main_tables)) + else: + outputs.append(label.render_paginated(request, main_tables)) + + return outputs