diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index bbf0174453..15049a5456 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -12,11 +12,15 @@ import common.models INVENTREE_SW_VERSION = "0.6.0 dev" # InvenTree API version -INVENTREE_API_VERSION = 19 +INVENTREE_API_VERSION = 20 """ Increment this API version number whenever there is a significant change to the API that any clients need to know about +v20 -> 2021-12-03 + - Adds ability to filter POLineItem endpoint by "base_part" + - Adds optional "order_detail" to POLineItem list endpoint + v19 -> 2021-12-02 - Adds the ability to filter the StockItem API by "part_tree" - Returns only stock items which match a particular part.tree_id field diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index dc5f5b87f4..bdeb8ee4f6 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -13,7 +13,6 @@ from rest_framework import generics from rest_framework import filters, status from rest_framework.response import Response - from InvenTree.filters import InvenTreeOrderingFilter from InvenTree.helpers import str2bool from InvenTree.api import AttachmentMixin @@ -300,6 +299,7 @@ class POLineItemList(generics.ListCreateAPIView): try: kwargs['part_detail'] = str2bool(self.request.query_params.get('part_detail', False)) + kwargs['order_detail'] = str2bool(self.request.query_params.get('order_detail', False)) except AttributeError: pass @@ -307,6 +307,28 @@ class POLineItemList(generics.ListCreateAPIView): return self.serializer_class(*args, **kwargs) + def filter_queryset(self, queryset): + """ + Additional filtering options + """ + + params = self.request.query_params + + queryset = super().filter_queryset(queryset) + + base_part = params.get('base_part', None) + + if base_part: + try: + base_part = Part.objects.get(pk=base_part) + + queryset = queryset.filter(part__part=base_part) + + except (ValueError, Part.DoesNotExist): + pass + + return queryset + filter_backends = [ rest_filters.DjangoFilterBackend, filters.SearchFilter, diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index 38a058ae6d..060fd9ff1f 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -143,12 +143,17 @@ class POLineItemSerializer(InvenTreeModelSerializer): part_detail = kwargs.pop('part_detail', False) + order_detail = kwargs.pop('order_detail', False) + super().__init__(*args, **kwargs) if part_detail is not True: self.fields.pop('part_detail') self.fields.pop('supplier_part_detail') + if order_detail is not True: + self.fields.pop('order_detail') + quantity = serializers.FloatField(default=1) received = serializers.FloatField(default=0) @@ -170,6 +175,8 @@ class POLineItemSerializer(InvenTreeModelSerializer): help_text=_('Purchase price currency'), ) + order_detail = POSerializer(source='order', read_only=True, many=False) + class Meta: model = PurchaseOrderLineItem @@ -179,6 +186,7 @@ class POLineItemSerializer(InvenTreeModelSerializer): 'reference', 'notes', 'order', + 'order_detail', 'part', 'part_detail', 'supplier_part_detail', diff --git a/InvenTree/part/templates/part/detail.html b/InvenTree/part/templates/part/detail.html index ce78e445e1..de1d46596a 100644 --- a/InvenTree/part/templates/part/detail.html +++ b/InvenTree/part/templates/part/detail.html @@ -73,7 +73,7 @@