From dfa3bbf655569fb0447d946efd318bcf48dc6284 Mon Sep 17 00:00:00 2001 From: Oliver 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