mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Adds a "filename_template" field to reports
- Allows users to define the naming scheme for generated reports - Templated, can use any context variable already available to the report instance - Adds some more context variables to various reports
This commit is contained in:
parent
8f6e14193a
commit
6de44a5921
@ -208,16 +208,24 @@ class ReportPrintMixin:
|
||||
# In debug mode, generate single HTML output, rather than PDF
|
||||
debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE')
|
||||
|
||||
# Start with a default report name
|
||||
report_name = "report.pdf"
|
||||
|
||||
# Merge one or more PDF files into a single download
|
||||
for item in items_to_print:
|
||||
report = self.get_object()
|
||||
report.object_to_print = item
|
||||
|
||||
report_name = report.generate_filename(request)
|
||||
|
||||
if debug_mode:
|
||||
outputs.append(report.render_as_string(request))
|
||||
else:
|
||||
outputs.append(report.render(request))
|
||||
|
||||
if not report_name.endswith('.pdf'):
|
||||
report_name += '.pdf'
|
||||
|
||||
if debug_mode:
|
||||
"""
|
||||
Contatenate all rendered templates into a single HTML string,
|
||||
@ -248,7 +256,7 @@ class ReportPrintMixin:
|
||||
|
||||
return InvenTree.helpers.DownloadFile(
|
||||
pdf,
|
||||
'inventree_report.pdf',
|
||||
report_name,
|
||||
content_type='application/pdf'
|
||||
)
|
||||
|
||||
|
38
InvenTree/report/migrations/0016_auto_20210513_1303.py
Normal file
38
InvenTree/report/migrations/0016_auto_20210513_1303.py
Normal file
@ -0,0 +1,38 @@
|
||||
# Generated by Django 3.2 on 2021-05-13 03:03
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('report', '0015_auto_20210403_1837'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='billofmaterialsreport',
|
||||
name='filename_pattern',
|
||||
field=models.CharField(default='report.pdf', help_text='Pattern for generating report filenames', max_length=100, verbose_name='Filename Pattern'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='buildreport',
|
||||
name='filename_pattern',
|
||||
field=models.CharField(default='report.pdf', help_text='Pattern for generating report filenames', max_length=100, verbose_name='Filename Pattern'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='purchaseorderreport',
|
||||
name='filename_pattern',
|
||||
field=models.CharField(default='report.pdf', help_text='Pattern for generating report filenames', max_length=100, verbose_name='Filename Pattern'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='salesorderreport',
|
||||
name='filename_pattern',
|
||||
field=models.CharField(default='report.pdf', help_text='Pattern for generating report filenames', max_length=100, verbose_name='Filename Pattern'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='testreport',
|
||||
name='filename_pattern',
|
||||
field=models.CharField(default='report.pdf', help_text='Pattern for generating report filenames', max_length=100, verbose_name='Filename Pattern'),
|
||||
),
|
||||
]
|
@ -16,6 +16,7 @@ from django.conf import settings
|
||||
from django.core.exceptions import ValidationError, FieldError
|
||||
|
||||
from django.template.loader import render_to_string
|
||||
from django.template import Template, Context
|
||||
|
||||
from django.core.files.storage import FileSystemStorage
|
||||
from django.core.validators import FileExtensionValidator
|
||||
@ -224,6 +225,7 @@ class ReportTemplateBase(ReportBase):
|
||||
All context to be passed to the renderer.
|
||||
"""
|
||||
|
||||
# Generate custom context data based on the particular report subclass
|
||||
context = self.get_context_data(request)
|
||||
|
||||
context['base_url'] = common.models.InvenTreeSetting.get_setting('INVENTREE_BASE_URL')
|
||||
@ -238,9 +240,22 @@ class ReportTemplateBase(ReportBase):
|
||||
|
||||
return context
|
||||
|
||||
def generate_filename(self, request, **kwargs):
|
||||
"""
|
||||
Generate a filename for this report
|
||||
"""
|
||||
|
||||
template_string = Template(self.filename_pattern)
|
||||
|
||||
ctx = self.context(request)
|
||||
|
||||
context = Context(ctx)
|
||||
|
||||
return template_string.render(context)
|
||||
|
||||
def render_as_string(self, request, **kwargs):
|
||||
"""
|
||||
Render the report to a HTML stiring.
|
||||
Render the report to a HTML string.
|
||||
|
||||
Useful for debug mode (viewing generated code)
|
||||
"""
|
||||
@ -269,6 +284,13 @@ class ReportTemplateBase(ReportBase):
|
||||
self.context(request),
|
||||
**kwargs)
|
||||
|
||||
filename_pattern = models.CharField(
|
||||
default="report.pdf",
|
||||
verbose_name=_('Filename Pattern'),
|
||||
help_text=_('Pattern for generating report filenames'),
|
||||
max_length=100,
|
||||
)
|
||||
|
||||
enabled = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('Enabled'),
|
||||
@ -326,6 +348,7 @@ class TestReport(ReportTemplateBase):
|
||||
|
||||
return {
|
||||
'stock_item': stock_item,
|
||||
'serial': stock_item.serial,
|
||||
'part': stock_item.part,
|
||||
'results': stock_item.testResultMap(include_installed=self.include_installed),
|
||||
'result_list': stock_item.testResultList(include_installed=self.include_installed)
|
||||
@ -367,6 +390,7 @@ class BuildReport(ReportTemplateBase):
|
||||
'bom_items': my_build.part.get_bom_items(),
|
||||
'reference': my_build.reference,
|
||||
'quantity': my_build.quantity,
|
||||
'title': str(my_build),
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user