Skip to content

Commit 8f2210d

Browse files
authored
Merge pull request #26 from cloudblue/bugfix/LITE-20832
LITE-20832 Malformed RQL select query is correctly handled
2 parents 0852140 + cddf474 commit 8f2210d

File tree

5 files changed

+21
-10
lines changed

5 files changed

+21
-10
lines changed

dj_rql/drf/compat.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ def get_query(cls, filter_instance, request, view):
3939
else:
4040
return cls.get_rql_query(filter_instance, request, query_string)
4141
except Exception:
42-
raise RQLFilterParsingError(details={
43-
'error': 'Bad filter query.',
44-
})
42+
raise RQLFilterParsingError()
4543

4644
@classmethod
4745
def modify_initial_query(cls, filter_instance, request, query_string):
@@ -251,7 +249,7 @@ def _add_quotes_to_value(cls, value):
251249

252250
@staticmethod
253251
def _conversion_error():
254-
raise RQLFilterParsingError(details={'error': 'Bad filter query.'})
252+
raise RQLFilterParsingError()
255253

256254
@classmethod
257255
def _get_filters_similar_to_old_syntax(cls, filter_instance):

dj_rql/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class RQLFilterParsingError(RQLFilterError):
1616
""" Parsing errors are raised only at query parsing time. """
1717
MESSAGE = 'RQL Parsing error.'
1818

19+
def __init__(self, **kwargs):
20+
kwargs.setdefault('details', {'error': 'Bad filter query.'})
21+
super().__init__(**kwargs)
22+
1923

2024
class RQLFilterLookupError(RQLFilterError):
2125
""" Lookup error is raised when provided lookup is not supported by the associated filter. """

dj_rql/filter_cls.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,11 @@ def apply_filters(self, query, request=None, view=None):
202202
qs = rql_transformer.transform(rql_ast)
203203
except LarkError as e:
204204
# Lark reraises it's errors, but the original ones are needed
205-
raise e.orig_exc
205+
original_error = e.orig_exc
206+
if not isinstance(original_error, (AssertionError, LarkError)):
207+
raise original_error
208+
209+
raise RQLFilterParsingError()
206210

207211
qs = self._apply_ordering(qs, rql_transformer.ordering_filters)
208212
select_filters = rql_transformer.select_filters

dj_rql/parser.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ def parse_query(self, query):
1515
rql_ast = RQLParser.parse(query)
1616
return rql_ast
1717
except LarkError:
18-
raise RQLFilterParsingError(details={
19-
'error': 'Bad filter query.',
20-
})
18+
raise RQLFilterParsingError()
2119

2220

2321
RQLParser = RQLLarkParser(RQL_GRAMMAR, parser='lalr', start='start')

tests/test_filter_cls/test_apply_filters.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ def apply_filters(query):
2525
return list(q)
2626

2727

28-
def test_parsing_error():
29-
bad_query = 'q='
28+
@pytest.mark.parametrize('bad_query', ['q=', '(select(stats.attributes))&select(stats.attributes)'])
29+
def test_parsing_error(bad_query):
3030
with pytest.raises(RQLFilterParsingError) as e:
3131
apply_filters(bad_query)
32+
3233
assert e.value.details['error'] == 'Bad filter query.'
3334

3435

@@ -176,6 +177,12 @@ def test_null_with_in_or():
176177
assert apply_filters('or(title=eq={0},eq(title,{1}))'.format(title, RQL_NULL)) == books
177178

178179

180+
@pytest.mark.django_db
181+
def test_non_select_for_select_field():
182+
with pytest.raises(RQLFilterLookupError):
183+
apply_filters('select_author=abc')
184+
185+
179186
@pytest.mark.django_db
180187
def test_null_on_foreign_key_pk():
181188
publisher = Publisher.objects.create()

0 commit comments

Comments
 (0)