From c04ea3e0bb75080a31dc0b7fa1dd66ee4f3ca91e Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 24 Nov 2021 10:41:19 +1100 Subject: [PATCH 1/3] Adds unit test for "validated" filter option on BomItem list --- InvenTree/part/api.py | 16 ++++++++-------- InvenTree/part/test_api.py | 9 ++++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 633f46d6e7..3cbe15d133 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -1081,6 +1081,14 @@ class BomFilter(rest_filters.FilterSet): inherited = rest_filters.BooleanFilter(label='BOM line is inherited') allow_variants = rest_filters.BooleanFilter(label='Variants are allowed') + # Filters for linked 'part' + part_active = rest_filters.BooleanFilter(label='Master part is active', field_name='part__active') + part_trackable = rest_filters.BooleanFilter(label='Master part is trackable', field_name='part__trackable') + + # Filters for linked 'sub_part' + sub_part_trackable = rest_filters.BooleanFilter(label='Sub part is trackable', field_name='sub_part__trackable') + sub_part_assembly = rest_filters.BooleanFilter(label='Sub part is an assembly', field_name='sub_part__assembly') + validated = rest_filters.BooleanFilter(label='BOM line has been validated', method='filter_validated') def filter_validated(self, queryset, name, value): @@ -1099,14 +1107,6 @@ class BomFilter(rest_filters.FilterSet): return queryset - # Filters for linked 'part' - part_active = rest_filters.BooleanFilter(label='Master part is active', field_name='part__active') - part_trackable = rest_filters.BooleanFilter(label='Master part is trackable', field_name='part__trackable') - - # Filters for linked 'sub_part' - sub_part_trackable = rest_filters.BooleanFilter(label='Sub part is trackable', field_name='sub_part__trackable') - sub_part_assembly = rest_filters.BooleanFilter(label='Sub part is an assembly', field_name='sub_part__assembly') - class BomList(generics.ListCreateAPIView): """ diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index ba38ffa879..99f531306f 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -925,7 +925,14 @@ class BomItemTest(InvenTreeAPITestCase): expected_code=200 ) - print("results:", len(response.data)) + # Filter by "validated" + response = self.get( + url, + data={ + 'validated': True, + }, + expected_code=200, + ) def test_get_bom_detail(self): """ From 568e606d5b2696d2cf5ed6686b98cabe32a54931 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 24 Nov 2021 10:45:48 +1100 Subject: [PATCH 2/3] Fix filtering by 'validated' parameter --- InvenTree/part/api.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 3cbe15d133..e61e8cde74 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -1096,11 +1096,17 @@ class BomFilter(rest_filters.FilterSet): # Work out which lines have actually been validated pks = [] + value = str2bool(value) + + # Shortcut for quicker filtering - BomItem with empty 'checksum' values are not validated + if value: + queryset = queryset.exclude(checksum=None).exclude(checksum='') + for bom_item in queryset.all(): - if bom_item.is_line_valid(): + if bom_item.is_line_valid: pks.append(bom_item.pk) - if str2bool(value): + if value: queryset = queryset.filter(pk__in=pks) else: queryset = queryset.exclude(pk__in=pks) From 28dc417a9f2ffccefa51aa3e6975be7102b3cf4e Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 24 Nov 2021 10:52:20 +1100 Subject: [PATCH 3/3] Add unit testing for 'validated' filter --- InvenTree/part/test_api.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 99f531306f..9704734234 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -934,6 +934,38 @@ class BomItemTest(InvenTreeAPITestCase): expected_code=200, ) + # Should be zero validated results + self.assertEqual(len(response.data), 0) + + # Now filter by "not validated" + response = self.get( + url, + data={ + 'validated': False, + }, + expected_code=200 + ) + + # There should be at least one non-validated item + self.assertTrue(len(response.data) > 0) + + # Now, let's validate an item + bom_item = BomItem.objects.first() + + bom_item.validate_hash() + + response = self.get( + url, + data={ + 'validated': True, + }, + expected_code=200 + ) + + # Check that the expected response is returned + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]['pk'], bom_item.pk) + def test_get_bom_detail(self): """ Get the detail view for a single BomItem object