diff --git a/grantnav/frontend/search_helpers.py b/grantnav/frontend/search_helpers.py index 3fcfc071..5b0bc6aa 100644 --- a/grantnav/frontend/search_helpers.py +++ b/grantnav/frontend/search_helpers.py @@ -341,4 +341,4 @@ def term_parameters_from_json_query(parameters, json_query, field_name, param_na values.append(filter['term'][field_name]) parameters[param_name] = values if must_not: - parameters["exclude_" + param_name] = "true" + parameters["exclude_" + param_name] = ["true"] diff --git a/grantnav/frontend/views.py b/grantnav/frontend/views.py index 6d4d1209..5309f006 100644 --- a/grantnav/frontend/views.py +++ b/grantnav/frontend/views.py @@ -637,8 +637,12 @@ def create_parameters_from_json_query(json_query, **extra_parameters): parameter_list = [] for parameter, list_value in parameters.items(): - for value in list_value: - parameter_list.append((parameter, value)) + if isinstance(list_value, list): + for value in list_value: + parameter_list.append((parameter, value)) + else: + parameter_list.append((parameter, list_value)) + for parameter, value in extra_parameters.items(): parameter_list.append((parameter, value)) diff --git a/tests/tests_units.py b/tests/tests_units.py index 9cf21612..15c9f2ab 100644 --- a/tests/tests_units.py +++ b/tests/tests_units.py @@ -1,6 +1,7 @@ import json import time import os +import copy from django.test import TestCase, Client, RequestFactory, override_settings from django.urls import reverse_lazy @@ -446,3 +447,27 @@ def test_district_filter_ajax(self): f"{uri}?parent_field=additional_data&child_field=recipientDistrictName&filter_search=a" ) assert len(json.loads(response.content)["results"]) == 73 + + def test_exclude_fundingOrganization_parameter_encoding_bug_1232(self): + """ + Test that exclude_fundingOrganization=true doesn't get split into characters + """ + + # Create a query with exclude filter (must_not) + json_query = copy.deepcopy(BASIC_QUERY) + json_query["query"]["bool"]["filter"][0]["bool"]["must_not"] = [ + {"term": {"fundingOrganization.id_and_name": '["Test Funder", "org-123"]'}} + ] + + # Convert to URL parameters + encoded_url = create_parameters_from_json_query(json_query) + + self.assertIn("exclude_fundingOrganization=true", encoded_url, + "URL should contain exclude_fundingOrganization=true as a single parameter") + + # Verify the bug doesn't occur by checking individual character parameters don't exist + self.assertNotIn("exclude_fundingOrganization=t&", encoded_url, + "URL should not split 'true' into individual character parameters") + self.assertNotIn("exclude_fundingOrganization=r", encoded_url) + self.assertNotIn("exclude_fundingOrganization=u", encoded_url) + self.assertNotIn("exclude_fundingOrganization=e", encoded_url)