From dfa3bbf655569fb0447d946efd318bcf48dc6284 Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Thu, 14 Apr 2022 12:49:27 +1000
Subject: [PATCH] Add ability to include test results from "installed items" in
 table

---
 InvenTree/stock/api.py                        | 33 ++++++++++++++++++-
 InvenTree/templates/js/translated/stock.js    | 25 ++++++++++----
 .../templates/js/translated/table_filters.js  | 11 ++++++-
 3 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index 34563b38d7..5d41624936 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -1105,7 +1105,6 @@ class StockItemTestResultList(generics.ListCreateAPIView):
     ]
 
     filter_fields = [
-        'stock_item',
         'test',
         'user',
         'result',
@@ -1114,6 +1113,38 @@ class StockItemTestResultList(generics.ListCreateAPIView):
 
     ordering = 'date'
 
+    def filter_queryset(self, queryset):
+
+        params = self.request.query_params
+
+        queryset = super().filter_queryset(queryset)
+
+        # Filter by stock item
+        item = params.get('stock_item', None)
+
+        if item is not None:
+            try:
+                item = StockItem.objects.get(pk=item)
+
+                items = [item]
+
+                # Do we wish to also include test results for 'installed' items?
+                include_installed = str2bool(params.get('include_installed', False))
+
+                if include_installed:
+                    # Include items which are installed "underneath" this item
+                    # Note that this function is recursive!
+                    installed_items = item.get_installed_items(cascade=True)
+
+                    items += [it for it in installed_items]
+                
+                queryset = queryset.filter(stock_item__in=items)
+
+            except (ValueError, StockItem.DoesNotExist):
+                pass
+
+        return queryset
+
     def get_serializer(self, *args, **kwargs):
         try:
             kwargs['user_detail'] = str2bool(self.request.query_params.get('user_detail', False))
diff --git a/InvenTree/templates/js/translated/stock.js b/InvenTree/templates/js/translated/stock.js
index b7afdbca44..6c448107fc 100644
--- a/InvenTree/templates/js/translated/stock.js
+++ b/InvenTree/templates/js/translated/stock.js
@@ -1331,14 +1331,27 @@ function loadStockTestResultsTable(table, options) {
             });
 
             // Once the test template data are loaded, query for test results
+
+            var filters = loadTableFilters(filterKey);
+
+            var query_params = {
+                stock_item: options.stock_item,
+                user_detail: true,
+                attachment_detail: true,
+                ordering: '-date',
+            };
+
+            if ('result' in filters) {
+                query_params.result = filters.result;
+            }
+
+            if ('include_installed' in filters) {
+                query_params.include_installed = filters.include_installed;
+            }
+
             inventreeGet(
                 '{% url "api-stock-test-result-list" %}',
-                {
-                    stock_item: options.stock_item,
-                    user_detail: true,
-                    attachment_detail: true,
-                    ordering: '-date',
-                },
+                query_params,
                 {
                     success: function(data) {
                         // Iterate through the returned test data
diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js
index 6212568950..8eca911f08 100644
--- a/InvenTree/templates/js/translated/table_filters.js
+++ b/InvenTree/templates/js/translated/table_filters.js
@@ -265,7 +265,16 @@ function getAvailableTableFilters(tableKey) {
 
     // Filters for the 'stock test' table
     if (tableKey == 'stocktests') {
-        return {};
+        return {
+            result: {
+                type: 'bool',
+                title: '{% trans "Test Passed" %}',
+            },
+            include_installed: {
+                type: 'bool',
+                title: '{% trans "Include Installed Items" %}',
+            }
+        };
     }
 
     // Filters for the 'part test template' table