From a00441a1c0ca791d07c72be763013d02fb2d1848 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 21 Jun 2021 00:28:28 +1000 Subject: [PATCH] Adds API endpoints for ManufacturerPartParameter mdoel --- InvenTree/InvenTree/version.py | 5 +- InvenTree/company/api.py | 91 +++++++++++++++++++++++++++++++- InvenTree/company/serializers.py | 31 ++++++++++- 3 files changed, 123 insertions(+), 4 deletions(-) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 5161bee6a1..a47ef3b667 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -20,9 +20,12 @@ v4 -> 2021-06-01 - BOM items can now accept "variant stock" to be assigned against them - Many slight API tweaks were needed to get this to work properly! +v5 -> 2021-06-21 + - Adds API interface for manufacturer part parameters + """ -INVENTREE_API_VERSION = 4 +INVENTREE_API_VERSION = 5 def inventreeInstanceName(): diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 3842045bac..6cd1e83dfa 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -15,11 +15,11 @@ from django.db.models import Q from InvenTree.helpers import str2bool from .models import Company -from .models import ManufacturerPart +from .models import ManufacturerPart, ManufacturerPartParameter from .models import SupplierPart, SupplierPriceBreak from .serializers import CompanySerializer -from .serializers import ManufacturerPartSerializer +from .serializers import ManufacturerPartSerializer, ManufacturerPartParameterSerializer from .serializers import SupplierPartSerializer, SupplierPriceBreakSerializer @@ -175,6 +175,86 @@ class ManufacturerPartDetail(generics.RetrieveUpdateDestroyAPIView): serializer_class = ManufacturerPartSerializer +class ManufacturerPartParameterList(generics.ListCreateAPIView): + """ + API endpoint for list view of ManufacturerPartParamater model. + """ + + queryset = ManufacturerPartParameter.objects.all() + serializer_class = ManufacturerPartParameterSerializer + + def get_serializer(self, *args, **kwargs): + + # Do we wish to include any extra detail? + try: + params = self.request.query_params + + optional_fields = [ + 'manufacturer_part_detail', + ] + + for key in optional_fields: + kwargs[key] = str2bool(params.get(key, None)) + + except AttributeError: + pass + + kwargs['context'] = self.get_serializer_context() + + return self.serializer_class(*args, **kwargs) + + def filter_queryset(self, queryset): + """ + Custom filtering for the queryset + """ + + queryset = super().filter_queryset(queryset) + + params = self.request.query_params + + # Filter by manufacturer? + manufacturer = params.get('manufacturer', None) + + if manufacturer is not None: + queryset = queryset.filter(manufacturer_part__manufacturer=manufacturer) + + # Filter by part? + part = params.get('part', None) + + if part is not None: + queryset = queryset.filter(manufacturer_part__part=part) + + return queryset + + filter_backends = [ + DjangoFilterBackend, + filters.SearchFilter, + filters.OrderingFilter, + ] + + filter_fields = [ + 'name', + 'value', + 'units', + 'manufacturer_part', + ] + + search_fields = [ + 'name', + 'value', + 'units', + ] + + +class ManufacturerPartParameterDetail(generics.RetrieveUpdateDestroyAPIView): + """ + API endpoint for detail view of ManufacturerPartParameter model + """ + + queryset = ManufacturerPartParameter.objects.all() + serializer_class = ManufacturerPartParameterSerializer + + class SupplierPartList(generics.ListCreateAPIView): """ API endpoint for list view of SupplierPart object @@ -316,6 +396,13 @@ class SupplierPriceBreakList(generics.ListCreateAPIView): manufacturer_part_api_urls = [ + url(r'^parameter/', include([ + url(r'^(?P\d+)/', ManufacturerPartParameterDetail.as_view(), name='api-manufacturer-part-parameter-detail'), + + # Catch anything else + url(r'^.*$', ManufacturerPartParameterList.as_view(), name='api-manufacturer-part-parameter-list'), + ])), + url(r'^(?P\d+)/?', ManufacturerPartDetail.as_view(), name='api-manufacturer-part-detail'), # Catch anything else diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 4b1019656e..471d26bd3f 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -7,7 +7,7 @@ from rest_framework import serializers from sql_util.utils import SubqueryCount from .models import Company -from .models import ManufacturerPart +from .models import ManufacturerPart, ManufacturerPartParameter from .models import SupplierPart, SupplierPriceBreak from InvenTree.serializers import InvenTreeModelSerializer @@ -124,6 +124,35 @@ class ManufacturerPartSerializer(InvenTreeModelSerializer): ] +class ManufacturerPartParameterSerializer(InvenTreeModelSerializer): + """ + Serializer for the ManufacturerPartParameter model + """ + + manufacturer_part_detail = ManufacturerPartSerializer(source='manufacturer_part', many=False, read_only=True) + + def __init__(self, *args, **kwargs): + + man_detail = kwargs.pop('manufacturer_part_detail', False) + + super(ManufacturerPartParameterSerializer, self).__init__(*args, **kwargs) + + if not man_detail: + self.fields.pop('manufacturer_part_detail') + + class Meta: + model = ManufacturerPartParameter + + fields = [ + 'pk', + 'manufacturer_part', + 'manufacturer_part_detail', + 'name', + 'value', + 'units', + ] + + class SupplierPartSerializer(InvenTreeModelSerializer): """ Serializer for SupplierPart object """