mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 22:04:48 +03:00
Fixed issue 3957 where serializer_class wass accessed directly on the view in OrderingFilter backend instead of calling the view's get_serializer_class method
This commit is contained in:
parent
450c76472b
commit
df1fc8df7d
|
@ -227,8 +227,9 @@ class OrderingFilter(BaseFilterBackend):
|
||||||
|
|
||||||
if valid_fields is None:
|
if valid_fields is None:
|
||||||
# Default to allowing filtering on serializer fields
|
# Default to allowing filtering on serializer fields
|
||||||
serializer_class = getattr(view, 'serializer_class')
|
try:
|
||||||
if serializer_class is None:
|
serializer_class = view.get_serializer_class()
|
||||||
|
except AssertionError:
|
||||||
msg = ("Cannot use %s on a view which does not have either a "
|
msg = ("Cannot use %s on a view which does not have either a "
|
||||||
"'serializer_class' or 'ordering_fields' attribute.")
|
"'serializer_class' or 'ordering_fields' attribute.")
|
||||||
raise ImproperlyConfigured(msg % self.__class__.__name__)
|
raise ImproperlyConfigured(msg % self.__class__.__name__)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import unittest
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
@ -585,6 +586,53 @@ class OrderingFilterTests(TestCase):
|
||||||
)
|
)
|
||||||
OrderingFilterModel(title=title, text=text).save()
|
OrderingFilterModel(title=title, text=text).save()
|
||||||
|
|
||||||
|
def test_get_valid_fields_from_explicit_serializer_class(self):
|
||||||
|
class OrderingListView(generics.ListAPIView):
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
serializer_class = OrderingFilterSerializer
|
||||||
|
filter_backends = (filters.OrderingFilter, )
|
||||||
|
ordering_fields = None
|
||||||
|
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
view = OrderingListView()
|
||||||
|
backend = filters.OrderingFilter()
|
||||||
|
valid_fields = backend.get_valid_fields(queryset, view)
|
||||||
|
expected_valid_fields = [(field.source or field_name, field.label)
|
||||||
|
for (field_name, field) in OrderingFilterSerializer().fields.items()
|
||||||
|
if not getattr(field, 'write_only', False) and not field.source == '*']
|
||||||
|
self.assertEqual(valid_fields, expected_valid_fields)
|
||||||
|
|
||||||
|
def test_get_valid_fields_from_explicit_get_serializer_class(self):
|
||||||
|
class OrderingListView(generics.ListAPIView):
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
filter_backends = (filters.OrderingFilter,)
|
||||||
|
ordering_fields = None
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
return OrderingFilterSerializer
|
||||||
|
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
view = OrderingListView()
|
||||||
|
backend = filters.OrderingFilter()
|
||||||
|
valid_fields = backend.get_valid_fields(queryset, view)
|
||||||
|
expected_valid_fields = [(field.source or field_name, field.label)
|
||||||
|
for (field_name, field) in OrderingFilterSerializer().fields.items()
|
||||||
|
if not getattr(field, 'write_only', False) and not field.source == '*']
|
||||||
|
self.assertEqual(valid_fields, expected_valid_fields)
|
||||||
|
|
||||||
|
def test_improperly_configured_error_from_get_valid_fields(self):
|
||||||
|
class OrderingListView(generics.ListAPIView):
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
filter_backends = (filters.OrderingFilter,)
|
||||||
|
ordering_fields = None
|
||||||
|
serializer_class = None
|
||||||
|
|
||||||
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
view = OrderingListView()
|
||||||
|
backend = filters.OrderingFilter()
|
||||||
|
with self.assertRaises(ImproperlyConfigured):
|
||||||
|
backend.get_valid_fields(queryset, view)
|
||||||
|
|
||||||
def test_ordering(self):
|
def test_ordering(self):
|
||||||
class OrderingListView(generics.ListAPIView):
|
class OrderingListView(generics.ListAPIView):
|
||||||
queryset = OrderingFilterModel.objects.all()
|
queryset = OrderingFilterModel.objects.all()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user