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 <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson 2024-06-03 07:24:01 -07:00 committed by GitHub
parent fdad59c8cc
commit 8e48e939aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 5 deletions

View File

@ -649,7 +649,7 @@ class IPAddressTest(APIViewTestCases.APIViewTestCase):
'description': 'New description', 'description': 'New description',
} }
graphql_filter = { graphql_filter = {
'address': '192.168.0.1/24', 'address': {'lookup': 'i_exact', 'value': '192.168.0.1/24'},
} }
@classmethod @classmethod

View File

@ -23,8 +23,9 @@ def map_strawberry_type(field):
elif isinstance(field, MultiValueArrayFilter): elif isinstance(field, MultiValueArrayFilter):
pass pass
elif isinstance(field, MultiValueCharFilter): elif isinstance(field, MultiValueCharFilter):
should_create_function = True # Note: Need to use the legacy FilterLookup from filters, not from
attr_type = List[str] | None # strawberry_django.FilterLookup as we currently have USE_DEPRECATED_FILTERS
attr_type = strawberry_django.filters.FilterLookup[str] | None
elif isinstance(field, MultiValueDateFilter): elif isinstance(field, MultiValueDateFilter):
attr_type = auto attr_type = auto
elif isinstance(field, MultiValueDateTimeFilter): elif isinstance(field, MultiValueDateTimeFilter):

View File

@ -493,10 +493,18 @@ class APIViewTestCases:
def _build_filtered_query(self, name, **filters): 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: 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}}})' filter_string = f'(filters: {{{filter_string}}})'
else: else:
filter_string = '' filter_string = ''