Merge pull request #6014 from chrismeyersfsu/improvement-graceful_query_fail

400 on invalid host filter query instead of 500
This commit is contained in:
Chris Meyers 2017-04-13 10:52:24 -04:00 committed by GitHub
commit 56442b2364
3 changed files with 15 additions and 9 deletions

View File

@ -1710,6 +1710,13 @@ class HostList(ListCreateAPIView):
qs = qs.filter(filter_q)
return qs
def list(self, *args, **kwargs):
try:
queryset = self.get_queryset()
except Exception as e:
return Response(dict(error=_(unicode(e))), status=status.HTTP_400_BAD_REQUEST)
return Response(dict(results=self.serializer_class(queryset, many=True).data))
class HostDetail(RetrieveUpdateDestroyAPIView):

View File

@ -488,13 +488,8 @@ class DynamicFilterField(models.TextField):
* handle keys with " via: a.\"b.c="yeah"
* handle key with __ in it
* add not support
* transform [] into contains via: a.b.c[].d[].e.f[]="blah"
* handle optional value quoted: a.b.c=""
'''
filter_string_raw = filter_string
filter_string = unicode(filter_string)
atom = CharsNotIn(unicode_spaces_other)
@ -511,7 +506,11 @@ class DynamicFilterField(models.TextField):
("or", 2, opAssoc.LEFT, cls.BoolOr),
])
res = boolExpr.parseString('(' + filter_string + ')')
try:
res = boolExpr.parseString('(' + filter_string + ')')
except:
raise RuntimeError(u"Invalid query %s" % filter_string_raw)
if len(res) > 0:
return res[0].result

View File

@ -1,7 +1,6 @@
# Python
import pytest
from pyparsing import ParseException
# AWX
from awx.main.fields import DynamicFilterField
@ -32,8 +31,9 @@ class TestDynamicFilterFieldFilterStringToQ():
'a__b__c__ space =ggg',
])
def test_invalid_filter_strings(self, filter_string):
with pytest.raises(ParseException):
with pytest.raises(RuntimeError) as e:
DynamicFilterField.filter_string_to_q(filter_string)
assert e.value.message == u"Invalid query " + filter_string
@pytest.mark.parametrize("filter_string,q_expected", [
(u'(a=abc\u1F5E3def)', Q(**{u"a": u"abc\u1F5E3def"})),