Merge pull request #5117 from rpkilby/fix-filter-backend

Fix DjangoFilterBackend mro
This commit is contained in:
Tom Christie 2017-05-04 12:32:03 +01:00 committed by GitHub
commit 69b0ac52c2
3 changed files with 23 additions and 5 deletions

View File

@ -1,6 +1,6 @@
# Optional packages which may be used with REST framework. # Optional packages which may be used with REST framework.
markdown==2.6.4 markdown==2.6.4
django-guardian==1.4.8 django-guardian==1.4.8
django-filter==1.0.0 django-filter==1.0.2
coreapi==2.2.4 coreapi==2.2.4
coreschema==0.0.4 coreschema==0.0.4

View File

@ -50,12 +50,17 @@ if django_filters:
DeprecationWarning DeprecationWarning
) )
return super(FilterSet, self).__init__(*args, **kwargs) return super(FilterSet, self).__init__(*args, **kwargs)
DFBase = django_filters.rest_framework.DjangoFilterBackend
else: else:
def FilterSet(): def FilterSet():
assert False, 'django-filter must be installed to use the `FilterSet` class' assert False, 'django-filter must be installed to use the `FilterSet` class'
DFBase = BaseFilterBackend
class DjangoFilterBackend(BaseFilterBackend):
class DjangoFilterBackend(DFBase):
""" """
A filter backend that uses django-filter. A filter backend that uses django-filter.
""" """
@ -69,9 +74,7 @@ class DjangoFilterBackend(BaseFilterBackend):
DeprecationWarning DeprecationWarning
) )
from django_filters.rest_framework import DjangoFilterBackend return super(DjangoFilterBackend, cls).__new__(cls, *args, **kwargs)
return DjangoFilterBackend(*args, **kwargs)
class SearchFilter(BaseFilterBackend): class SearchFilter(BaseFilterBackend):

View File

@ -201,6 +201,21 @@ class IntegrationTestFiltering(CommonFilteringTestCase):
assert response.data == self.data assert response.data == self.data
assert len(w) == 0 assert len(w) == 0
@unittest.skipUnless(django_filters, 'django-filter not installed')
def test_backend_mro(self):
class CustomBackend(filters.DjangoFilterBackend):
def filter_queryset(self, request, queryset, view):
assert False, "custom filter_queryset should run"
class DFFilterFieldsRootView(FilterFieldsRootView):
filter_backends = (CustomBackend,)
view = DFFilterFieldsRootView.as_view()
request = factory.get('/')
with pytest.raises(AssertionError, message="custom filter_queryset should run"):
view(request).render()
@unittest.skipUnless(django_filters, 'django-filter not installed') @unittest.skipUnless(django_filters, 'django-filter not installed')
def test_get_filtered_fields_root_view(self): def test_get_filtered_fields_root_view(self):
""" """