From 8e48e939aab3b75a50c73cb46b2cc4c30f801ae8 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Mon, 3 Jun 2024 07:24:01 -0700 Subject: [PATCH] 16261 fix graphql lookup for MultiValueCharFilter fields (#16354) * 16261 fix graphql lookup for MultiValueCharFilter fields * 16261 fix graphql lookup for MultiValueCharFilter fields * 16261 fixup test * 16261 fixup test * Omit redundant assignment --------- Co-authored-by: Jeremy Stretch --- netbox/ipam/tests/test_api.py | 2 +- netbox/netbox/graphql/filter_mixins.py | 5 +++-- netbox/utilities/testing/api.py | 12 ++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 20ba35c6b..2cf7a2f1c 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/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index 322435c72..5075e9aa2 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -23,8 +23,9 @@ def map_strawberry_type(field): elif isinstance(field, MultiValueArrayFilter): pass elif isinstance(field, MultiValueCharFilter): - should_create_function = True - attr_type = List[str] | None + # 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 elif isinstance(field, MultiValueDateTimeFilter): diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 019d6e6ca..62ac817e2 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -493,10 +493,18 @@ class APIViewTestCases: 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: - 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 = ''