From 30d95e1511f932eea381b96b28815410e1422102 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 6 Feb 2021 17:36:22 +1100 Subject: [PATCH] Add 'REPORT_DEBUG_MODE' setting - If set, reports are printed in raw HTML - Not pretty, but useful for debugging output of rendered template --- InvenTree/common/models.py | 7 +++ InvenTree/report/api.py | 55 ++++++++++++++----- InvenTree/report/models.py | 34 +++++++++--- .../report/inventree_test_report.html | 6 +- .../templates/InvenTree/settings/report.html | 1 + 5 files changed, 79 insertions(+), 24 deletions(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 5785d8eb7a..9e6c6e868d 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -174,6 +174,13 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'REPORT_DEBUG_MODE': { + 'name': _('Debug Mode'), + 'description': _('Generate reports in debug mode (HTML output)'), + 'default': False, + 'validator': bool, + }, + 'REPORT_DEFAULT_PAGE_SIZE': { 'name': _('Page Size'), 'description': _('Default page size for PDF reports'), diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py index aaffc47a9c..f3f790ae4f 100644 --- a/InvenTree/report/api.py +++ b/InvenTree/report/api.py @@ -3,12 +3,14 @@ from __future__ import unicode_literals from django.utils.translation import ugettext as _ from django.conf.urls import url, include +from django.http import HttpResponse from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics, filters from rest_framework.response import Response +import common.models import InvenTree.helpers from stock.models import StockItem @@ -165,31 +167,54 @@ class StockItemTestReportPrint(generics.RetrieveAPIView, StockItemReportMixin): outputs = [] + # In debug mode, generate single HTML output, rather than PDF + debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE') + # Merge one or more PDF files into a single download for item in items: report = self.get_object() report.stock_item = item - outputs.append(report.render(request)) + if debug_mode: + outputs.append(report.render_to_string(request)) + else: + outputs.append(report.render(request)) - pages = [] - if len(outputs) > 1: - # If more than one output is generated, merge them into a single file - for output in outputs: - doc = output.get_document() - for page in doc.pages: - pages.append(page) + if debug_mode: + """ + Contatenate all rendered templates into a single HTML string, + and return the string as a HTML response. + """ + + html = "\n".join(outputs) + + return HttpResponse(html) - pdf = outputs[0].get_document().copy(pages).write_pdf() else: - pdf = outputs[0].get_document().write_pdf() + """ + Concatenate all rendered pages into a single PDF object, + and return the resulting document! + """ - return InvenTree.helpers.DownloadFile( - pdf, - 'test_report.pdf', - content_type='application/pdf' - ) + pages = [] + + if len(outputs) > 1: + # If more than one output is generated, merge them into a single file + 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() + else: + pdf = outputs[0].get_document().write_pdf() + + return InvenTree.helpers.DownloadFile( + pdf, + 'test_report.pdf', + content_type='application/pdf' + ) report_api_urls = [ diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index 0d8d8365dd..ddb7e9ea94 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -14,6 +14,8 @@ import datetime from django.db import models from django.conf import settings +from django.template.loader import render_to_string + from django.core.files.storage import FileSystemStorage from django.core.validators import FileExtensionValidator @@ -175,16 +177,11 @@ class ReportTemplateBase(ReportBase): return {} - def render(self, request, **kwargs): + def context(self, request): """ - Render the template to a PDF file. - - Uses django-weasyprint plugin to render HTML template against Weasyprint + All context to be passed to the renderer. """ - # TODO: Support custom filename generation! - # filename = kwargs.get('filename', 'report.pdf') - context = self.get_context_data(request) context['date'] = datetime.datetime.now().date() @@ -196,6 +193,27 @@ class ReportTemplateBase(ReportBase): context['request'] = request context['user'] = request.user + return context + + def render_to_string(self, request, **kwargs): + """ + Render the report to a HTML stiring. + + Useful for debug mode (viewing generated code) + """ + + return render_to_string(self.template_name, self.context(request), request) + + def render(self, request, **kwargs): + """ + Render the template to a PDF file. + + Uses django-weasyprint plugin to render HTML template against Weasyprint + """ + + # TODO: Support custom filename generation! + # filename = kwargs.get('filename', 'report.pdf') + # Render HTML template to PDF wp = WeasyprintReportMixin( request, @@ -205,7 +223,7 @@ class ReportTemplateBase(ReportBase): **kwargs) return wp.render_to_response( - context, + self.context(request), **kwargs) enabled = models.BooleanField( diff --git a/InvenTree/report/templates/report/inventree_test_report.html b/InvenTree/report/templates/report/inventree_test_report.html index e076a7919e..4c585d531b 100644 --- a/InvenTree/report/templates/report/inventree_test_report.html +++ b/InvenTree/report/templates/report/inventree_test_report.html @@ -50,6 +50,10 @@ content: "{% trans 'Stock Item Test Report' %}"; width: 50%; } +.part-img { + height: 4cm; +} + {% endblock %} {% block page_content %} @@ -64,7 +68,7 @@ content: "{% trans 'Stock Item Test Report' %}";

Stock Item ID: {{ stock_item.pk }}

- +

{% if stock_item.is_serialized %} diff --git a/InvenTree/templates/InvenTree/settings/report.html b/InvenTree/templates/InvenTree/settings/report.html index acded5b465..4e68030ee5 100644 --- a/InvenTree/templates/InvenTree/settings/report.html +++ b/InvenTree/templates/InvenTree/settings/report.html @@ -16,6 +16,7 @@ {% include "InvenTree/settings/header.html" %} {% include "InvenTree/settings/setting.html" with key="REPORT_DEFAULT_PAGE_SIZE" %} + {% include "InvenTree/settings/setting.html" with key="REPORT_DEBUG_MODE" %} {% include "InvenTree/settings/setting.html" with key="REPORT_ENABLE_TEST_REPORT" %}