From ae4ae1c579fc3312fb73fa5cd723f9acec6bf3e9 Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Fri, 16 Dec 2022 13:19:57 +1100
Subject: [PATCH] Adds API endpoint for listing stocktake information

---
 InvenTree/part/api.py         | 28 +++++++++++++++++++++++++++-
 InvenTree/part/serializers.py | 19 ++++++++++++++++++-
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py
index 77e0dbd03e..de8bb6b06b 100644
--- a/InvenTree/part/api.py
+++ b/InvenTree/part/api.py
@@ -38,7 +38,7 @@ from .models import (BomItem, BomItemSubstitute, Part, PartAttachment,
                      PartCategory, PartCategoryParameterTemplate,
                      PartInternalPriceBreak, PartParameter,
                      PartParameterTemplate, PartRelated, PartSellPriceBreak,
-                     PartTestTemplate)
+                     PartStocktake, PartTestTemplate)
 
 
 class CategoryList(APIDownloadMixin, ListCreateAPI):
@@ -1696,6 +1696,27 @@ class PartParameterDetail(RetrieveUpdateDestroyAPI):
     serializer_class = part_serializers.PartParameterSerializer
 
 
+class PartStocktakeFilter(rest_filters.FilterSet):
+    """Custom fitler for the PartStocktakeList endpoint"""
+
+    class Meta:
+        """Metaclass options"""
+
+        model = PartStocktake
+        fields = [
+            'part',
+            'user',
+        ]
+
+
+class PartStocktakeList(ListAPI):
+    """API endpoint for listing part stocktake information"""
+
+    queryset = PartStocktake.objects.all()
+    serializer_class = part_serializers.PartStocktakeSerializer
+    filterset_class = PartStocktakeFilter
+
+
 class BomFilter(rest_filters.FilterSet):
     """Custom filters for the BOM list."""
 
@@ -2111,6 +2132,11 @@ part_api_urls = [
         re_path(r'^.*$', PartParameterList.as_view(), name='api-part-parameter-list'),
     ])),
 
+    # Part stocktake data
+    re_path(r'^stocktake/', include([
+        re_path(r'^.*$', PartStocktakeList.as_view(), name='api-part-stocktake-list'),
+    ])),
+
     re_path(r'^thumbs/', include([
         path('', PartThumbs.as_view(), name='api-part-thumbs'),
         re_path(r'^(?P<pk>\d+)/?', PartThumbsUpdate.as_view(), name='api-part-thumbs-update'),
diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py
index 45a0a5e55e..d924b6002d 100644
--- a/InvenTree/part/serializers.py
+++ b/InvenTree/part/serializers.py
@@ -31,7 +31,8 @@ from .models import (BomItem, BomItemSubstitute, Part, PartAttachment,
                      PartCategory, PartCategoryParameterTemplate,
                      PartInternalPriceBreak, PartParameter,
                      PartParameterTemplate, PartPricing, PartRelated,
-                     PartSellPriceBreak, PartStar, PartTestTemplate)
+                     PartSellPriceBreak, PartStar, PartStocktake,
+                     PartTestTemplate)
 
 
 class CategorySerializer(InvenTreeModelSerializer):
@@ -504,6 +505,22 @@ class PartSerializer(RemoteImageMixin, InvenTreeModelSerializer):
         return self.instance
 
 
+class PartStocktakeSerializer(InvenTreeModelSerializer):
+    """Serializer for the PartStocktake model"""
+
+    class Meta:
+        """Metaclass options"""
+
+        model = PartStocktake
+        fields = [
+            'pk',
+            'date',
+            'part',
+            'quantity',
+            'user',
+        ]
+
+
 class PartPricingSerializer(InvenTreeModelSerializer):
     """Serializer for Part pricing information"""