diff --git a/awx/main/fields.py b/awx/main/fields.py index 63f8159b46..be70f47fd0 100644 --- a/awx/main/fields.py +++ b/awx/main/fields.py @@ -453,10 +453,14 @@ class DynamicFilterField(models.TextField): class BoolBinOp(object): def __init__(self, t): - self.left = t[0][0].result - self.right = t[0][2].result - - self.result = self.execute_logic(self.left, self.right) + self.result = None + i = 2 + while i < len(t[0]): + if not self.result: + self.result = t[0][0].result + right = t[0][i].result + self.result = self.execute_logic(self.result, right) + i += 2 class BoolAnd(BoolBinOp): @@ -508,7 +512,7 @@ class DynamicFilterField(models.TextField): try: res = boolExpr.parseString('(' + filter_string + ')') - except: + except Exception: raise RuntimeError(u"Invalid query %s" % filter_string_raw) if len(res) > 0: diff --git a/awx/main/tests/unit/test_fields.py b/awx/main/tests/unit/test_fields.py index 08a31e50f0..fc20dfcb1d 100644 --- a/awx/main/tests/unit/test_fields.py +++ b/awx/main/tests/unit/test_fields.py @@ -49,7 +49,8 @@ class TestDynamicFilterFieldFilterStringToQ(): ('a=b or c=d', Q(**{u"a": u"b"}) | Q(**{u"c": u"d"})), ('(a=b and c=d) or (e=f)', (Q(**{u"a": u"b"}) & Q(**{u"c": u"d"})) | (Q(**{u"e": u"f"}))), ('(a=b and not c=d) or not (e=f)', (Q(**{u"a": u"b"}) & ~Q(**{u"c": u"d"})) | (~Q(**{u"e": u"f"}))), - ('(a=b) and not (c=d or (e=f and (g=h or i=j))) or (y=z)', Q(**{u"a": u"b"}) & ~(Q(**{u"c": u"d"}) | (Q(**{u"e": u"f"}) & (Q(**{u"g": u"h"}) | Q(**{u"i": u"j"})))) | Q(**{u"y": u"z"})) + ('(a=b) and not (c=d or (e=f and (g=h or i=j))) or (y=z)', Q(**{u"a": u"b"}) & ~(Q(**{u"c": u"d"}) | (Q(**{u"e": u"f"}) & (Q(**{u"g": u"h"}) | Q(**{u"i": u"j"})))) | Q(**{u"y": u"z"})), + ('a=b or a=d or a=e or a=z and b=h and b=i and b=j and b=k', Q(**{u"a": u"b"}) | Q(**{u"a": u"d"}) | Q(**{u"a": u"e"}) | Q(**{u"a": u"z"}) & Q(**{u"b": u"h"}) & Q(**{u"b": u"i"}) & Q(**{u"b": u"j"}) & Q(**{u"b": u"k"})) ]) def test_boolean_parenthesis(self, filter_string, q_expected): q = DynamicFilterField.filter_string_to_q(filter_string)