mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 21:25:42 +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:
		| @@ -208,16 +208,24 @@ class ReportPrintMixin: | |||||||
|         # In debug mode, generate single HTML output, rather than PDF |         # In debug mode, generate single HTML output, rather than PDF | ||||||
|         debug_mode = common.models.InvenTreeSetting.get_setting('REPORT_DEBUG_MODE') |         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 |         # Merge one or more PDF files into a single download | ||||||
|         for item in items_to_print: |         for item in items_to_print: | ||||||
|             report = self.get_object() |             report = self.get_object() | ||||||
|             report.object_to_print = item |             report.object_to_print = item | ||||||
|  |  | ||||||
|  |             report_name = report.generate_filename(request) | ||||||
|  |  | ||||||
|             if debug_mode: |             if debug_mode: | ||||||
|                 outputs.append(report.render_as_string(request)) |                 outputs.append(report.render_as_string(request)) | ||||||
|             else: |             else: | ||||||
|                 outputs.append(report.render(request)) |                 outputs.append(report.render(request)) | ||||||
|  |  | ||||||
|  |         if not report_name.endswith('.pdf'): | ||||||
|  |             report_name += '.pdf' | ||||||
|  |  | ||||||
|         if debug_mode: |         if debug_mode: | ||||||
|             """ |             """ | ||||||
|             Contatenate all rendered templates into a single HTML string, |             Contatenate all rendered templates into a single HTML string, | ||||||
| @@ -248,7 +256,7 @@ class ReportPrintMixin: | |||||||
|  |  | ||||||
|             return InvenTree.helpers.DownloadFile( |             return InvenTree.helpers.DownloadFile( | ||||||
|                 pdf, |                 pdf, | ||||||
|                 'inventree_report.pdf', |                 report_name, | ||||||
|                 content_type='application/pdf' |                 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.core.exceptions import ValidationError, FieldError | ||||||
|  |  | ||||||
| from django.template.loader import render_to_string | from django.template.loader import render_to_string | ||||||
|  | from django.template import Template, Context | ||||||
|  |  | ||||||
| from django.core.files.storage import FileSystemStorage | from django.core.files.storage import FileSystemStorage | ||||||
| from django.core.validators import FileExtensionValidator | from django.core.validators import FileExtensionValidator | ||||||
| @@ -224,6 +225,7 @@ class ReportTemplateBase(ReportBase): | |||||||
|         All context to be passed to the renderer. |         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 = self.get_context_data(request) | ||||||
|  |  | ||||||
|         context['base_url'] = common.models.InvenTreeSetting.get_setting('INVENTREE_BASE_URL') |         context['base_url'] = common.models.InvenTreeSetting.get_setting('INVENTREE_BASE_URL') | ||||||
| @@ -238,9 +240,22 @@ class ReportTemplateBase(ReportBase): | |||||||
|  |  | ||||||
|         return context |         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): |     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) |         Useful for debug mode (viewing generated code) | ||||||
|         """ |         """ | ||||||
| @@ -269,6 +284,13 @@ class ReportTemplateBase(ReportBase): | |||||||
|             self.context(request), |             self.context(request), | ||||||
|             **kwargs) |             **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( |     enabled = models.BooleanField( | ||||||
|         default=True, |         default=True, | ||||||
|         verbose_name=_('Enabled'), |         verbose_name=_('Enabled'), | ||||||
| @@ -326,6 +348,7 @@ class TestReport(ReportTemplateBase): | |||||||
|  |  | ||||||
|         return { |         return { | ||||||
|             'stock_item': stock_item, |             'stock_item': stock_item, | ||||||
|  |             'serial': stock_item.serial, | ||||||
|             'part': stock_item.part, |             'part': stock_item.part, | ||||||
|             'results': stock_item.testResultMap(include_installed=self.include_installed), |             'results': stock_item.testResultMap(include_installed=self.include_installed), | ||||||
|             'result_list': stock_item.testResultList(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(), |             'bom_items': my_build.part.get_bom_items(), | ||||||
|             'reference': my_build.reference, |             'reference': my_build.reference, | ||||||
|             'quantity': my_build.quantity, |             'quantity': my_build.quantity, | ||||||
|  |             'title': str(my_build), | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user