From cc8238b790aadaa71c5b3221473043c5a7af6f62 Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Wed, 6 Jul 2022 15:28:44 +1000
Subject: [PATCH] Allow BOM table to be filtered by "stock available" parameter
 (#3301)

* Allow BOM table to be filtered by "stock available" parameter

* Update API version info

* PEP fixes
---
 InvenTree/InvenTree/api_version.py                 |  4 ++++
 InvenTree/part/api.py                              | 14 ++++++++++++++
 InvenTree/templates/js/translated/table_filters.js |  4 ++++
 3 files changed, 22 insertions(+)

diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py
index 6db9e05719..8da4135b12 100644
--- a/InvenTree/InvenTree/api_version.py
+++ b/InvenTree/InvenTree/api_version.py
@@ -7,8 +7,12 @@ INVENTREE_API_VERSION = 61
 """
 Increment this API version number whenever there is a significant change to the API that any clients need to know about
 
+v63 -> 2022-07-06 : https://github.com/inventree/InvenTree/pull/3301
+    - Allow BOM List API endpoint to be filtered by "available_stock" paramater
+
 v62 -> 2022-07-05 : https://github.com/inventree/InvenTree/pull/3296
     - Allows search on BOM List API endpoint
+    - Allows ordering on BOM List API endpoint
 
 v61 -> 2022-06-12 : https://github.com/inventree/InvenTree/pull/3183
     - Migrate the "Convert Stock Item" form class to use the API
diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py
index c4cada7430..ca67ba1b35 100644
--- a/InvenTree/part/api.py
+++ b/InvenTree/part/api.py
@@ -1531,6 +1531,20 @@ class BomFilter(rest_filters.FilterSet):
 
         return queryset
 
+    available_stock = rest_filters.BooleanFilter(label="Has available stock", method="filter_available_stock")
+
+    def filter_available_stock(self, queryset, name, value):
+        """Filter the queryset based on whether each line item has any available stock"""
+
+        value = str2bool(value)
+
+        if value:
+            queryset = queryset.filter(available_stock__gt=0)
+        else:
+            queryset = queryset.filter(available_stock=0)
+
+        return queryset
+
 
 class BomList(ListCreateDestroyAPIView):
     """API endpoint for accessing a list of BomItem objects.
diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js
index d2a1f4c9bd..c13ee3fb1a 100644
--- a/InvenTree/templates/js/translated/table_filters.js
+++ b/InvenTree/templates/js/translated/table_filters.js
@@ -59,6 +59,10 @@ function getAvailableTableFilters(tableKey) {
                 type: 'bool',
                 title: '{% trans "Assembled Part" %}',
             },
+            available_stock: {
+                type: 'bool',
+                title: '{% trans "Has Available Stock" %}',
+            },
             validated: {
                 type: 'bool',
                 title: '{% trans "Validated" %}',