Skip to content

Commit c1ca3c3

Browse files
Merge pull request #2 from maxipavlovic/bugfix/LITE-14144
LITE-14144 Compatibility Backends are now less error-prone
2 parents f224e83 + e1378cc commit c1ca3c3

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

dj_rql/drf/compat.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,18 @@ class CompatibilityRQLFilterBackend(RQLFilterBackend):
2929
"""
3030
@classmethod
3131
def get_query(cls, filter_instance, request, view):
32-
query_string = cls.modify_initial_query(filter_instance, request, get_query(request))
32+
try:
33+
query_string = cls.modify_initial_query(filter_instance, request, get_query(request))
3334

34-
if not cls.is_old_syntax(filter_instance, request, query_string):
35-
return query_string
35+
if not cls.is_old_syntax(filter_instance, request, query_string):
36+
return query_string
3637

37-
return cls.get_rql_query(filter_instance, request, query_string)
38+
else:
39+
return cls.get_rql_query(filter_instance, request, query_string)
40+
except Exception:
41+
raise RQLFilterParsingError(details={
42+
'error': 'Bad filter query.',
43+
})
3844

3945
@classmethod
4046
def modify_initial_query(cls, filter_instance, request, query_string):

tests/test_drf/test_django_filters_backend.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,20 @@ def test_old_syntax_filters(mocker):
7676
assert filter_instance.old_syntax_filters == {'t__in'}
7777

7878

79+
def test_bad_syntax_query(mocker):
80+
query = 'limit=10&offset=0&in=(prop,(val1,val2))&in(prop.prop,(val))' \
81+
'&ge=(created,2020-06-01T04:00:00Z)&le=(created,2020-06-24T03:59:59Z)'
82+
request = mocker.MagicMock(
83+
query_params=QueryDict(query),
84+
_request=mocker.MagicMock(META={'QUERY_STRING': query}),
85+
)
86+
filter_instance = BooksFilterClass(Book.objects.none())
87+
mocker.patch('dj_rql.drf.compat.DjangoFiltersRQLFilterBackend.is_old_syntax', return_value=True)
88+
89+
with pytest.raises(RQLFilterParsingError):
90+
assert DjangoFiltersRQLFilterBackend.get_query(filter_instance, request, None)
91+
92+
7993
@pytest.mark.parametrize('query', (
8094
'select(books)&k__in=v,v', 'k__in=v,v&select(books)',
8195
))

0 commit comments

Comments
 (0)