diff --git a/src/backend/InvenTree/InvenTree/api.py b/src/backend/InvenTree/InvenTree/api.py index 4c91ae61cd..195972ff20 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -600,6 +600,32 @@ class BulkUpdateMixin(BulkOperationMixin): return Response({'success': f'Updated {n} items'}, status=200) +class ParameterListMixin: + """Mixin class which supports filtering against parametric fields.""" + + parameter_model_class = None + + def filter_queryset(self, queryset): + """Perform filtering against parametric fields.""" + import common.filters + + queryset = super().filter_queryset(queryset) + + # Filter by parametric data + queryset = common.filters.filter_parametric_data( + queryset, self.request.query_params + ) + + # Apply ordering based on query parameter + queryset = common.filters.order_by_parameter( + queryset, + self.parameter_model_class, + self.request.query_params.get('ordering', None), + ) + + return queryset + + class BulkDeleteMixin(BulkOperationMixin): """Mixin class for enabling 'bulk delete' operations for various models. diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index 2862a9fb76..f1ca50f439 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -9,7 +9,7 @@ from django_filters.rest_framework.filterset import FilterSet import part.models from data_exporter.mixins import DataExportViewMixin -from InvenTree.api import ListCreateDestroyAPIView, MetadataView +from InvenTree.api import ListCreateDestroyAPIView, MetadataView, ParameterListMixin from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import SEARCH_ORDER_FILTER, SEARCH_ORDER_FILTER_ALIAS from InvenTree.mixins import ( @@ -51,7 +51,7 @@ class CompanyMixin(OutputOptionsMixin): return queryset -class CompanyList(CompanyMixin, DataExportViewMixin, ListCreateAPI): +class CompanyList(CompanyMixin, ParameterListMixin, DataExportViewMixin, ListCreateAPI): """API endpoint for accessing a list of Company objects. Provides two methods: @@ -60,6 +60,7 @@ class CompanyList(CompanyMixin, DataExportViewMixin, ListCreateAPI): - POST: Create a new Company object """ + parameter_model_class = Company filter_backends = SEARCH_ORDER_FILTER filterset_fields = [ @@ -191,6 +192,7 @@ class ManufacturerPartList( ManufacturerPartMixin, SerializerContextMixin, OutputOptionsMixin, + ParameterListMixin, ListCreateDestroyAPIView, ): """API endpoint for list view of ManufacturerPart object. @@ -199,6 +201,7 @@ class ManufacturerPartList( - POST: Create a new ManufacturerPart object """ + parameter_model_class = ManufacturerPart filterset_class = ManufacturerPartFilter filter_backends = SEARCH_ORDER_FILTER output_options = ManufacturerOutputOptions @@ -337,7 +340,11 @@ class SupplierPartMixin: class SupplierPartList( - DataExportViewMixin, SupplierPartMixin, OutputOptionsMixin, ListCreateDestroyAPIView + DataExportViewMixin, + SupplierPartMixin, + ParameterListMixin, + OutputOptionsMixin, + ListCreateDestroyAPIView, ): """API endpoint for list view of SupplierPart object. @@ -345,8 +352,8 @@ class SupplierPartList( - POST: Create a new SupplierPart object """ + parameter_model_class = SupplierPart filterset_class = SupplierPartFilter - filter_backends = SEARCH_ORDER_FILTER_ALIAS output_options = SupplierPartOutputOptions diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 555cc15db5..b700fafd22 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -19,6 +19,7 @@ from InvenTree.api import ( BulkUpdateMixin, ListCreateDestroyAPIView, MetadataView, + ParameterListMixin, ) from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import ( @@ -1066,32 +1067,20 @@ class PartOutputOptions(OutputConfiguration): class PartList( - PartMixin, BulkUpdateMixin, DataExportViewMixin, OutputOptionsMixin, ListCreateAPI + PartMixin, + BulkUpdateMixin, + ParameterListMixin, + DataExportViewMixin, + OutputOptionsMixin, + ListCreateAPI, ): """API endpoint for accessing a list of Part objects, or creating a new Part instance.""" + parameter_model_class = Part output_options = PartOutputOptions filterset_class = PartFilter is_create = True - def filter_queryset(self, queryset): - """Perform custom filtering of the queryset.""" - import common.filters - - queryset = super().filter_queryset(queryset) - - # Filter by parametric data - queryset = common.filters.filter_parametric_data( - queryset, self.request.query_params - ) - - # Apply ordering based on query parameter - queryset = common.filters.order_by_parameter( - queryset, Part, self.request.query_params.get('ordering', None) - ) - - return queryset - filter_backends = SEARCH_ORDER_FILTER_ALIAS ordering_fields = [ diff --git a/src/frontend/src/components/buttons/SegmentedIconControl.tsx b/src/frontend/src/components/buttons/SegmentedIconControl.tsx index 9cdbfc9132..0271a2dcbe 100644 --- a/src/frontend/src/components/buttons/SegmentedIconControl.tsx +++ b/src/frontend/src/components/buttons/SegmentedIconControl.tsx @@ -33,7 +33,7 @@ export default function SegmentedIconControl({ data={data.map((item) => ({ value: item.value, label: ( - +