From b8cfdcd2ed7120da40fe287123523dfa57170e57 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 29 May 2024 11:36:05 -0700 Subject: [PATCH 1/5] 16261 fix graphql lookup for MultiValueCharFilter fields --- netbox/netbox/graphql/filter_mixins.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index 322435c7202..c7436453d1a 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -23,8 +23,8 @@ def map_strawberry_type(field): elif isinstance(field, MultiValueArrayFilter): pass elif isinstance(field, MultiValueCharFilter): - should_create_function = True - attr_type = List[str] | None + should_create_function = False + attr_type = strawberry_django.filters.FilterLookup[str] | None elif isinstance(field, MultiValueDateFilter): attr_type = auto elif isinstance(field, MultiValueDateTimeFilter): From d93569a5e1c01689af1d0770387b35453954babb Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 29 May 2024 11:48:59 -0700 Subject: [PATCH 2/5] 16261 fix graphql lookup for MultiValueCharFilter fields --- netbox/netbox/graphql/filter_mixins.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index c7436453d1a..e77acdfae76 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -24,6 +24,8 @@ def map_strawberry_type(field): pass elif isinstance(field, MultiValueCharFilter): should_create_function = False + # Note: Need to use the legacy FilterLookup from filters, not from + # strawberry_django.FilterLookup as we currently have USE_DEPRECATED_FILTERS attr_type = strawberry_django.filters.FilterLookup[str] | None elif isinstance(field, MultiValueDateFilter): attr_type = auto From 8f8141875388e49c50e09a3ec3b6f3fbb3fd1286 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 29 May 2024 12:56:07 -0700 Subject: [PATCH 3/5] 16261 fixup test --- netbox/ipam/tests/test_api.py | 2 +- netbox/utilities/testing/api.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 20ba35c6b62..2cf7a2f1c80 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -649,7 +649,7 @@ class IPAddressTest(APIViewTestCases.APIViewTestCase): 'description': 'New description', } graphql_filter = { - 'address': '192.168.0.1/24', + 'address': {'lookup': 'i_exact', 'value': '192.168.0.1/24'}, } @classmethod diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 019d6e6ca2b..b7e9f9c7e45 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -496,7 +496,14 @@ def _build_filtered_query(self, name, **filters): Create a filtered query: i.e. ip_address_list(filters: {address: "1.1.1.1/24"}){. """ if filters: - filter_string = ', '.join(f'{k}: "{v}"' for k, v in filters.items()) + for field_name, params in filters.items(): + lookup = params['lookup'] + value = params['value'] + if lookup: + query = f'{{{lookup}: "{value}"}}' + filter_string = f'{field_name}: {query}' + else: + filter_string = f'{field_name}: "{value}"' filter_string = f'(filters: {{{filter_string}}})' else: filter_string = '' From e1911a534bd0452a9e00748614a57aac8ee9161c Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 29 May 2024 13:04:17 -0700 Subject: [PATCH 4/5] 16261 fixup test --- netbox/utilities/testing/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index b7e9f9c7e45..62ac817e2d0 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -493,8 +493,9 @@ def _build_query_with_filter(self, name, filter_string): def _build_filtered_query(self, name, **filters): """ - Create a filtered query: i.e. ip_address_list(filters: {address: "1.1.1.1/24"}){. + Create a filtered query: i.e. device_list(filters: {name: {i_contains: "akron"}}){. """ + # TODO: This should be extended to support AND, OR multi-lookups if filters: for field_name, params in filters.items(): lookup = params['lookup'] From 36b1854e6c97e2ef8ec04c4cc0413aad28aaca75 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 3 Jun 2024 10:00:31 -0400 Subject: [PATCH 5/5] Omit redundant assignment --- netbox/netbox/graphql/filter_mixins.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index e77acdfae76..5075e9aa282 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -23,7 +23,6 @@ def map_strawberry_type(field): elif isinstance(field, MultiValueArrayFilter): pass elif isinstance(field, MultiValueCharFilter): - should_create_function = False # Note: Need to use the legacy FilterLookup from filters, not from # strawberry_django.FilterLookup as we currently have USE_DEPRECATED_FILTERS attr_type = strawberry_django.filters.FilterLookup[str] | None