From 727fd389783bf3dc033a689b2ba676252c728f6d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 10 Mar 2021 16:48:20 +1100 Subject: [PATCH] Add new report models --- ...14_purchaseorderreport_salesorderreport.py | 45 +++++++++++ InvenTree/report/models.py | 75 +++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 InvenTree/report/migrations/0014_purchaseorderreport_salesorderreport.py diff --git a/InvenTree/report/migrations/0014_purchaseorderreport_salesorderreport.py b/InvenTree/report/migrations/0014_purchaseorderreport_salesorderreport.py new file mode 100644 index 0000000000..ab734b7b48 --- /dev/null +++ b/InvenTree/report/migrations/0014_purchaseorderreport_salesorderreport.py @@ -0,0 +1,45 @@ +# Generated by Django 3.0.7 on 2021-03-10 05:46 + +import django.core.validators +from django.db import migrations, models +import report.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('report', '0013_testreport_include_installed'), + ] + + operations = [ + migrations.CreateModel( + name='PurchaseOrderReport', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Template name', max_length=100, verbose_name='Name')), + ('template', models.FileField(help_text='Report template file', upload_to=report.models.rename_template, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html', 'htm'])], verbose_name='Template')), + ('description', models.CharField(help_text='Report template description', max_length=250, verbose_name='Description')), + ('revision', models.PositiveIntegerField(default=1, editable=False, help_text='Report revision number (auto-increments)', verbose_name='Revision')), + ('enabled', models.BooleanField(default=True, help_text='Report template is enabled', verbose_name='Enabled')), + ('filters', models.CharField(blank=True, help_text='Purchase order query filters', max_length=250, validators=[report.models.validate_purchase_order_filters], verbose_name='Filters')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SalesOrderReport', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Template name', max_length=100, verbose_name='Name')), + ('template', models.FileField(help_text='Report template file', upload_to=report.models.rename_template, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html', 'htm'])], verbose_name='Template')), + ('description', models.CharField(help_text='Report template description', max_length=250, verbose_name='Description')), + ('revision', models.PositiveIntegerField(default=1, editable=False, help_text='Report revision number (auto-increments)', verbose_name='Revision')), + ('enabled', models.BooleanField(default=True, help_text='Report template is enabled', verbose_name='Enabled')), + ('filters', models.CharField(blank=True, help_text='Sales order query filters', max_length=250, validators=[report.models.validate_sales_order_filters], verbose_name='Filters')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index abbdea9025..53ed655d72 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -24,6 +24,7 @@ import build.models import common.models import part.models import stock.models +import order.models from InvenTree.helpers import validateFilterString @@ -94,6 +95,22 @@ def validate_build_report_filters(filters): return validateFilterString(filters, model=build.models.Build) +def validate_purchase_order_filters(filters): + """ + Validate filter string against PurchaseOrder model + """ + + return validateFilterString(filters, model=order.models.PurchaseOrder) + + +def validate_sales_order_filters(filters): + """ + Validate filter string against SalesOrder model + """ + + return validateFilterString(filters, model=order.models.SalesOrder) + + class WeasyprintReportMixin(WeasyTemplateResponseMixin): """ Class for rendering a HTML template to a PDF. @@ -383,6 +400,64 @@ class BillOfMaterialsReport(ReportTemplateBase): } +class PurchaseOrderReport(ReportTemplateBase): + """ + Render a report against a PurchaseOrder object + """ + + @classmethod + def getSubdir(cls): + return 'purchaseorder' + + filters = models.CharField( + blank=True, + max_length=250, + verbose_name=_('Filters'), + help_text=_('Purchase order query filters'), + validators=[ + validate_purchase_order_filters, + ] + ) + + def get_context_data(self, request): + + order = self.object_to_print + + return { + 'order': order, + 'supplier': order.supplier, + } + + +class SalesOrderReport(ReportTemplateBase): + """ + Render a report against a SalesOrder object + """ + + @classmethod + def getSubdir(cls): + return 'salesorder' + + filters = models.CharField( + blank=True, + max_length=250, + verbose_name=_('Filters'), + help_text=_('Sales order query filters'), + validators=[ + validate_sales_order_filters + ] + ) + + def get_context_data(self, request): + + order = self.object_to_print + + return { + 'order': order, + 'customer': order.customer, + } + + def rename_snippet(instance, filename): filename = os.path.basename(filename)