diff --git a/src/backend/InvenTree/plugin/builtin/labels/inventree_label.py b/src/backend/InvenTree/plugin/builtin/labels/inventree_label.py index 7654043ebd..685598087f 100644 --- a/src/backend/InvenTree/plugin/builtin/labels/inventree_label.py +++ b/src/backend/InvenTree/plugin/builtin/labels/inventree_label.py @@ -81,6 +81,9 @@ class InvenTreeLabelPlugin(LabelPrintingMixin, SettingsMixin, InvenTreePlugin): data = pdf_file.getvalue() pdf_file.close() - filename = kwargs.get('filename', 'labels.pdf') + filename = kwargs.get('filename') or 'labels.pdf' + + if not filename.lower().endswith('.pdf'): + filename = f'{filename}.pdf' return ContentFile(data, name=filename) diff --git a/src/backend/InvenTree/report/tests.py b/src/backend/InvenTree/report/tests.py index dc7da1f84b..865013c802 100644 --- a/src/backend/InvenTree/report/tests.py +++ b/src/backend/InvenTree/report/tests.py @@ -518,6 +518,35 @@ class LabelTest(InvenTreeAPITestCase): self.assertEqual(output.plugin, 'inventreelabel') self.assertTrue(output.output.name.endswith('.pdf')) + # Filename patterns without an extension must still produce PDF filenames. + template.filename_pattern = 'unit_test_label' + template.save() + + output = template.print(items=parts[:1], plugin=plugin) + + self.assertTrue(output.output.name.endswith('.pdf')) + + def test_generated_file_filename(self): + """PDF filenames retain existing suffixes and default when empty.""" + template = LabelTemplate.objects.filter(enabled=True, model_type='part').first() + plugin = registry.get_plugin('inventreelabel') + plugin.before_printing() + plugin.outputs.append( + plugin.render_to_pdf(template, Part.objects.first(), None) + ) + + for kwargs, expected in [ + ({'filename': 'unit_test_label'}, 'unit_test_label.pdf'), + ({'filename': 'unit_test_label.pdf'}, 'unit_test_label.pdf'), + ({'filename': 'unit_test_label.PDF'}, 'unit_test_label.PDF'), + ({'filename': ''}, 'labels.pdf'), + ({'filename': None}, 'labels.pdf'), + ({}, 'labels.pdf'), + ]: + with self.subTest(kwargs=kwargs): + output = plugin.get_generated_file(**kwargs) + self.assertEqual(output.name, expected) + def test_print_custom_template(self): """Test printing against a custom template file.""" template_string = """