diff --git a/src/backend/InvenTree/common/migrations/0041_auto_20251028_1112.py b/src/backend/InvenTree/common/migrations/0041_auto_20251028_1112.py index 36dd756385..6fe89f42ca 100644 --- a/src/backend/InvenTree/common/migrations/0041_auto_20251028_1112.py +++ b/src/backend/InvenTree/common/migrations/0041_auto_20251028_1112.py @@ -92,6 +92,7 @@ def copy_part_parameters(apps, schema_editor): data=parameter.data, data_numeric=parameter.data_numeric, note=parameter.note, + metadata=parameter.metadata, updated=parameter.updated, updated_by=parameter.updated_by )) diff --git a/src/backend/InvenTree/part/admin.py b/src/backend/InvenTree/part/admin.py index 6c6ae85b7a..91fe86585e 100644 --- a/src/backend/InvenTree/part/admin.py +++ b/src/backend/InvenTree/part/admin.py @@ -5,12 +5,6 @@ from django.contrib import admin from part import models -class PartParameterInline(admin.TabularInline): - """Inline for part parameter data.""" - - model = models.PartParameter - - @admin.register(models.Part) class PartAdmin(admin.ModelAdmin): """Admin class for the Part model.""" @@ -36,7 +30,7 @@ class PartAdmin(admin.ModelAdmin): 'creation_user', ] - inlines = [PartParameterInline] + inlines = [] @admin.register(models.PartPricing) diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 2af9a7f05f..9568cdfa8a 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -18,7 +18,6 @@ import part.filters import part.tasks as part_tasks from data_exporter.mixins import DataExportViewMixin from InvenTree.api import ( - BulkCreateMixin, BulkDeleteMixin, BulkUpdateMixin, ListCreateDestroyAPIView, @@ -1325,150 +1324,6 @@ class PartParameterTemplateFilter(FilterSet): return queryset.filter(pk__in=[el[0] for el in template_ids]) -class PartParameterTemplateMixin: - """Mixin class for PartParameterTemplate API endpoints.""" - - queryset = PartParameterTemplate.objects.all() - serializer_class = part_serializers.PartParameterTemplateSerializer - - def get_queryset(self, *args, **kwargs): - """Return an annotated queryset for the PartParameterTemplateDetail endpoint.""" - queryset = super().get_queryset(*args, **kwargs) - - queryset = part_serializers.PartParameterTemplateSerializer.annotate_queryset( - queryset - ) - - return queryset - - -class PartParameterTemplateList( - PartParameterTemplateMixin, DataExportViewMixin, ListCreateAPI -): - """API endpoint for accessing a list of PartParameterTemplate objects. - - - GET: Return list of PartParameterTemplate objects - - POST: Create a new PartParameterTemplate object - """ - - filterset_class = PartParameterTemplateFilter - - filter_backends = SEARCH_ORDER_FILTER - - search_fields = ['name', 'description'] - - ordering_fields = ['name', 'units', 'checkbox', 'parts'] - - -class PartParameterTemplateDetail(PartParameterTemplateMixin, RetrieveUpdateDestroyAPI): - """API endpoint for accessing the detail view for a PartParameterTemplate object.""" - - -class PartParameterOutputOptions(OutputConfiguration): - """Output options for the PartParameter endpoints.""" - - OPTIONS = [ - InvenTreeOutputOption('part_detail'), - InvenTreeOutputOption( - 'template_detail', - default=True, - description='Include detailed information about the part parameter template.', - ), - ] - - -class PartParameterAPIMixin: - """Mixin class for PartParameter API endpoints.""" - - queryset = PartParameter.objects.all() - serializer_class = part_serializers.PartParameterSerializer - output_options = PartParameterOutputOptions - - def get_queryset(self, *args, **kwargs): - """Override get_queryset method to prefetch related fields.""" - queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related('part', 'template', 'updated_by') - return queryset - - def get_serializer_context(self): - """Pass the 'request' object through to the serializer context.""" - context = super().get_serializer_context() - context['request'] = self.request - - return context - - -class PartParameterFilter(FilterSet): - """Custom filters for the PartParameterList API endpoint.""" - - class Meta: - """Metaclass options for the filterset.""" - - model = PartParameter - fields = ['template', 'updated_by'] - - part = rest_filters.ModelChoiceFilter( - queryset=Part.objects.all(), method='filter_part' - ) - - def filter_part(self, queryset, name, part): - """Filter against the provided part. - - If 'include_variants' query parameter is provided, filter against variant parts also - """ - try: - include_variants = str2bool(self.request.GET.get('include_variants', False)) - except AttributeError: - include_variants = False - - if include_variants: - return queryset.filter(part__in=part.get_descendants(include_self=True)) - else: - return queryset.filter(part=part) - - -class PartParameterList( - BulkCreateMixin, - PartParameterAPIMixin, - OutputOptionsMixin, - DataExportViewMixin, - ListCreateAPI, -): - """API endpoint for accessing a list of PartParameter objects. - - - GET: Return list of PartParameter objects - - POST: Create a new PartParameter object - """ - - filterset_class = PartParameterFilter - - filter_backends = SEARCH_ORDER_FILTER_ALIAS - - ordering_fields = ['name', 'data', 'part', 'template', 'updated', 'updated_by'] - - ordering_field_aliases = { - 'name': 'template__name', - 'units': 'template__units', - 'data': ['data_numeric', 'data'], - 'part': 'part__name', - } - - search_fields = [ - 'data', - 'template__name', - 'template__description', - 'template__units', - ] - - unique_create_fields = ['part', 'template'] - - -class PartParameterDetail( - PartParameterAPIMixin, OutputOptionsMixin, RetrieveUpdateDestroyAPI -): - """API endpoint for detail view of a single PartParameter object.""" - - class PartStocktakeFilter(FilterSet): """Custom filter for the PartStocktakeList endpoint.""" @@ -1880,53 +1735,6 @@ part_api_urls = [ path('', PartRelatedList.as_view(), name='api-part-related-list'), ]), ), - # Base URL for PartParameter API endpoints - path( - 'parameter/', - include([ - path( - 'template/', - include([ - path( - '/', - include([ - path( - 'metadata/', - MetadataView.as_view(model=PartParameterTemplate), - name='api-part-parameter-template-metadata', - ), - path( - '', - PartParameterTemplateDetail.as_view(), - name='api-part-parameter-template-detail', - ), - ]), - ), - path( - '', - PartParameterTemplateList.as_view(), - name='api-part-parameter-template-list', - ), - ]), - ), - path( - '/', - include([ - path( - 'metadata/', - MetadataView.as_view(model=PartParameter), - name='api-part-parameter-metadata', - ), - path( - '', - PartParameterDetail.as_view(), - name='api-part-parameter-detail', - ), - ]), - ), - path('', PartParameterList.as_view(), name='api-part-parameter-list'), - ]), - ), # Part stocktake data path( 'stocktake/',