From f332c0b8c3adfe929ff1cfe81f42874aae4a3d19 Mon Sep 17 00:00:00 2001 From: Yunfan Zhang Date: Wed, 13 Jun 2018 11:12:00 -0400 Subject: [PATCH] Make search in host_filter case insensitive. --- awx/main/tests/functional/api/test_host_filter.py | 3 +++ awx/main/tests/unit/utils/test_filters.py | 12 ++++++------ awx/main/utils/filters.py | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/awx/main/tests/functional/api/test_host_filter.py b/awx/main/tests/functional/api/test_host_filter.py index 8a19c24e2d..45542f6325 100644 --- a/awx/main/tests/functional/api/test_host_filter.py +++ b/awx/main/tests/functional/api/test_host_filter.py @@ -47,3 +47,6 @@ def test_q1(inventory_structure, get, user): query = '(name="host1" and groups__name="g1") or (name="host3" and groups__name="g2")' evaluate_query(query, [hosts[0], hosts[2]]) + # The following test verifies if the search in host_filter is case insensitive. + query = 'search="HOST1"' + evaluate_query(query, [hosts[0]]) diff --git a/awx/main/tests/unit/utils/test_filters.py b/awx/main/tests/unit/utils/test_filters.py index a8127fdfb6..f7d25d06f3 100644 --- a/awx/main/tests/unit/utils/test_filters.py +++ b/awx/main/tests/unit/utils/test_filters.py @@ -155,16 +155,16 @@ class TestSmartFilterQueryFromString(): @pytest.mark.parametrize("filter_string,q_expected", [ - ('search=foo', Q(Q(**{u"name__contains": u"foo"}) | Q(**{ u"description__contains": u"foo"}))), - ('group__search=foo', Q(Q(**{u"group__name__contains": u"foo"}) | Q(**{u"group__description__contains": u"foo"}))), + ('search=foo', Q(Q(**{u"name__icontains": u"foo"}) | Q(**{ u"description__icontains": u"foo"}))), + ('group__search=foo', Q(Q(**{u"group__name__icontains": u"foo"}) | Q(**{u"group__description__icontains": u"foo"}))), ('search=foo and group__search=foo', Q( - Q(**{u"name__contains": u"foo"}) | Q(**{ u"description__contains": u"foo"}), - Q(**{u"group__name__contains": u"foo"}) | Q(**{u"group__description__contains": u"foo"}))), + Q(**{u"name__icontains": u"foo"}) | Q(**{ u"description__icontains": u"foo"}), + Q(**{u"group__name__icontains": u"foo"}) | Q(**{u"group__description__icontains": u"foo"}))), ('search=foo or ansible_facts__a=null', - Q(Q(**{u"name__contains": u"foo"}) | Q(**{u"description__contains": u"foo"})) | + Q(Q(**{u"name__icontains": u"foo"}) | Q(**{u"description__icontains": u"foo"})) | Q(**{u"ansible_facts__contains": {u"a": None}})), ('search=foo or ansible_facts__a="null"', - Q(Q(**{u"name__contains": u"foo"}) | Q(**{u"description__contains": u"foo"})) | + Q(Q(**{u"name__icontains": u"foo"}) | Q(**{u"description__icontains": u"foo"})) | Q(**{u"ansible_facts__contains": {u"a": u"\"null\""}})), ]) def test_search_related_fields(self, mock_get_host_model, filter_string, q_expected): diff --git a/awx/main/utils/filters.py b/awx/main/utils/filters.py index 9563eb6c34..30daf338f2 100644 --- a/awx/main/utils/filters.py +++ b/awx/main/utils/filters.py @@ -144,7 +144,7 @@ class SmartFilter(object): search_kwargs = self._expand_search(k, v) if search_kwargs: kwargs.update(search_kwargs) - q = reduce(lambda x, y: x | y, [models.Q(**{u'%s__contains' % _k:_v}) for _k, _v in kwargs.items()]) + q = reduce(lambda x, y: x | y, [models.Q(**{u'%s__icontains' % _k:_v}) for _k, _v in kwargs.items()]) self.result = Host.objects.filter(q) else: kwargs[k] = v