From 530df327ca9cc47c6298eb819276cf9dbd145b25 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Fri, 19 May 2017 16:49:25 -0400 Subject: [PATCH] Call filter from BoolOperand and catch LookupError --- awx/main/tests/unit/utils/test_filters.py | 8 ++++---- awx/main/utils/filters.py | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/awx/main/tests/unit/utils/test_filters.py b/awx/main/tests/unit/utils/test_filters.py index 216e6dc001..a2f761c28b 100644 --- a/awx/main/tests/unit/utils/test_filters.py +++ b/awx/main/tests/unit/utils/test_filters.py @@ -116,14 +116,14 @@ class TestSmartFilterQueryFromString(): @pytest.mark.parametrize("filter_string,q_expected", [ - ('search=foo', Q(**{u"name": u"foo"}) | Q(**{ u"description": u"foo"})), - ('group__search=foo', Q(**{u"group__name": u"foo"}) | Q(**{u"group__description": u"foo"})), + ('search=foo', Q(Q(**{u"name": u"foo"}) | Q(**{ u"description": u"foo"}))), + ('group__search=foo', Q(Q(**{u"group__name": u"foo"}) | Q(**{u"group__description": u"foo"}))), ('search=foo and group__search=foo', Q( Q(**{u"name": u"foo"}) | Q(**{ u"description": u"foo"}), Q(**{u"group__name": u"foo"}) | Q(**{u"group__description": u"foo"}))), ('search=foo or ansible_facts__a=null', - (Q(**{u"name": u"foo"}) | Q(**{u"description": u"foo"})) | - Q(**{u"ansible_facts__contains": {u"a": u"null"}})), + Q(Q(**{u"name": u"foo"}) | Q(**{u"description": 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): q = SmartFilter.query_from_string(filter_string) diff --git a/awx/main/utils/filters.py b/awx/main/utils/filters.py index da35b71c5d..9d70a3589e 100644 --- a/awx/main/utils/filters.py +++ b/awx/main/utils/filters.py @@ -52,7 +52,7 @@ class SmartFilter(object): if search_kwargs: kwargs.update(search_kwargs) q = reduce(lambda x, y: x | y, [django.db.models.Q(**{u'%s' % _k:_v}) for _k, _v in kwargs.items()]) - self.result = q + self.result = Host.objects.filter(q) else: kwargs[k] = v self.result = Host.objects.filter(**kwargs) @@ -162,7 +162,10 @@ class SmartFilter(object): model = get_model('host') elif k.endswith('__search'): relation = k.split('__')[0] - model = get_model(relation) + try: + model = get_model(relation) + except LookupError: + raise ParseException('No related field named %s' % relation) search_kwargs = {} if model is not None: