From 27f7b6ed55d69b9678cff32bd82557cf39d2505b Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 20 Oct 2025 17:14:47 +1100 Subject: [PATCH] [API] Bug fix for FilterableSerializerMixin (#10632) - Handle case where data is being exported --- src/backend/InvenTree/InvenTree/mixins.py | 8 +++++++- src/backend/InvenTree/part/test_api.py | 24 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/backend/InvenTree/InvenTree/mixins.py b/src/backend/InvenTree/InvenTree/mixins.py index 756672ebd2..7538aab1aa 100644 --- a/src/backend/InvenTree/InvenTree/mixins.py +++ b/src/backend/InvenTree/InvenTree/mixins.py @@ -6,6 +6,7 @@ from rest_framework import generics, mixins, status from rest_framework.response import Response import data_exporter.mixins +import data_exporter.serializers import importer.mixins from InvenTree.fields import InvenTreeNotesField, OutputConfiguration from InvenTree.helpers import ( @@ -231,7 +232,12 @@ class OutputOptionsMixin: serializer = super().get_serializer(*args, **kwargs) # Check if the serializer actually can be filtered - makes not much sense to use this mixin without that prerequisite - if not isinstance(serializer, FilterableSerializerMixin): + if isinstance( + serializer, data_exporter.serializers.DataExportOptionsSerializer + ): + # Skip in this instance, special case for determining export options + pass + elif not isinstance(serializer, FilterableSerializerMixin): raise Exception( 'INVE-I2: `OutputOptionsMixin` can only be used with serializers that contain the `FilterableSerializerMixin` mixin' ) diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index f2d99f20fc..baf305c2f9 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -3339,3 +3339,27 @@ class PartTestTemplateTest(PartAPITestBase): response = self.patch(url, {'choices': 'a,b,c,d,e,f,f'}, expected_code=400) self.assertIn('Choices must be unique', str(response.data['choices'])) + + +class PartParameterTests(PartAPITestBase): + """Unit test for PartParameter API endpoints.""" + + def test_export_data(self): + """Test data export functionality for PartParameter objects.""" + url = reverse('api-part-parameter-list') + + response = self.options( + url, + data={ + 'export': True, + 'export_plugin': 'inventree-exporter', + 'part_detail': True, + 'template_detail': True, + }, + expected_code=200, + ) + + fields = response.data['actions']['GET'].keys() + + self.assertIn('export_format', fields) + self.assertIn('export_plugin', fields)