mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-02 20:54:42 +03:00
2.2's PendingDeprecationWarnings now become DeprecationWarnings. 2.3's PendingDeprecationWarnings added.
This commit is contained in:
parent
70831ad0bb
commit
dc7b1d6430
|
@ -200,9 +200,9 @@ class WritableField(Field):
|
||||||
|
|
||||||
# 'blank' is to be deprecated in favor of 'required'
|
# 'blank' is to be deprecated in favor of 'required'
|
||||||
if blank is not None:
|
if blank is not None:
|
||||||
warnings.warn('The `blank` keyword argument is due to deprecated. '
|
warnings.warn('The `blank` keyword argument is deprecated. '
|
||||||
'Use the `required` keyword argument instead.',
|
'Use the `required` keyword argument instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
required = not(blank)
|
required = not(blank)
|
||||||
|
|
||||||
super(WritableField, self).__init__(source=source)
|
super(WritableField, self).__init__(source=source)
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
Generic views that provide commonly needed behaviour.
|
Generic views that provide commonly needed behaviour.
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from rest_framework import views, mixins
|
|
||||||
from rest_framework.settings import api_settings
|
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.paginator import Paginator, InvalidPage
|
from django.core.paginator import Paginator, InvalidPage
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
from rest_framework import views, mixins
|
||||||
|
from rest_framework.exceptions import ConfigurationError
|
||||||
|
from rest_framework.settings import api_settings
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
class GenericAPIView(views.APIView):
|
class GenericAPIView(views.APIView):
|
||||||
|
@ -94,7 +97,12 @@ class GenericAPIView(views.APIView):
|
||||||
"""
|
"""
|
||||||
deprecated_style = False
|
deprecated_style = False
|
||||||
if page_size is not None:
|
if page_size is not None:
|
||||||
# TODO: Deperecation warning
|
warnings.warn('The `page_size` parameter to `paginate_queryset()` '
|
||||||
|
'is due to be deprecated. '
|
||||||
|
'Note that the return style of this method is also '
|
||||||
|
'changed, and will simply return a page object '
|
||||||
|
'when called without a `page_size` argument.',
|
||||||
|
PendingDeprecationWarning, stacklevel=2)
|
||||||
deprecated_style = True
|
deprecated_style = True
|
||||||
else:
|
else:
|
||||||
# Determine the required page size.
|
# Determine the required page size.
|
||||||
|
@ -155,7 +163,9 @@ class GenericAPIView(views.APIView):
|
||||||
Otherwise defaults to using `self.paginate_by`.
|
Otherwise defaults to using `self.paginate_by`.
|
||||||
"""
|
"""
|
||||||
if queryset is not None:
|
if queryset is not None:
|
||||||
pass # TODO: Deprecation warning
|
warnings.warn('The `queryset` parameter to `get_paginate_by()` '
|
||||||
|
'is due to be deprecated.',
|
||||||
|
PendingDeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
if self.paginate_by_param:
|
if self.paginate_by_param:
|
||||||
query_params = self.request.QUERY_PARAMS
|
query_params = self.request.QUERY_PARAMS
|
||||||
|
@ -226,17 +236,27 @@ class GenericAPIView(views.APIView):
|
||||||
|
|
||||||
if lookup is not None:
|
if lookup is not None:
|
||||||
filter_kwargs = {self.lookup_field: lookup}
|
filter_kwargs = {self.lookup_field: lookup}
|
||||||
elif pk is not None:
|
elif pk is not None and self.lookup_field == 'pk':
|
||||||
# TODO: Deprecation warning
|
warnings.warn(
|
||||||
|
'The `pk_url_kwarg` attribute is due to be deprecated. '
|
||||||
|
'Use the `lookup_field` attribute instead',
|
||||||
|
PendingDeprecationWarning
|
||||||
|
)
|
||||||
filter_kwargs = {'pk': pk}
|
filter_kwargs = {'pk': pk}
|
||||||
elif slug is not None:
|
elif slug is not None and self.lookup_field == 'pk':
|
||||||
# TODO: Deprecation warning
|
warnings.warn(
|
||||||
|
'The `slug_url_kwarg` attribute is due to be deprecated. '
|
||||||
|
'Use the `lookup_field` attribute instead',
|
||||||
|
PendingDeprecationWarning
|
||||||
|
)
|
||||||
filter_kwargs = {self.slug_field: slug}
|
filter_kwargs = {self.slug_field: slug}
|
||||||
else:
|
else:
|
||||||
# TODO: Fix error message
|
raise ConfigurationError(
|
||||||
raise AttributeError("Generic detail view %s must be called with "
|
'Expected view %s to be called with a URL keyword argument '
|
||||||
"either an object pk or a slug."
|
'named "%s". Fix your URL conf, or set the `.lookup_field` '
|
||||||
% self.__class__.__name__)
|
'attribute on the view correctly.' %
|
||||||
|
(self.__class__.__name__, self.lookup_field)
|
||||||
|
)
|
||||||
|
|
||||||
obj = get_object_or_404(queryset, **filter_kwargs)
|
obj = get_object_or_404(queryset, **filter_kwargs)
|
||||||
|
|
||||||
|
@ -391,8 +411,20 @@ class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
|
||||||
##########################
|
##########################
|
||||||
|
|
||||||
class MultipleObjectAPIView(GenericAPIView):
|
class MultipleObjectAPIView(GenericAPIView):
|
||||||
pass
|
def __init__(self, *args, **kwargs):
|
||||||
|
warnings.warn(
|
||||||
|
'Subclassing `MultipleObjectAPIView` is due to be deprecated. '
|
||||||
|
'You should simply subclass `GenericAPIView` instead.',
|
||||||
|
PendingDeprecationWarning, stacklevel=2
|
||||||
|
)
|
||||||
|
super(MultipleObjectAPIView, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class SingleObjectAPIView(GenericAPIView):
|
class SingleObjectAPIView(GenericAPIView):
|
||||||
pass
|
def __init__(self, *args, **kwargs):
|
||||||
|
warnings.warn(
|
||||||
|
'Subclassing `SingleObjectAPIView` is due to be deprecated. '
|
||||||
|
'You should simply subclass `GenericAPIView` instead.',
|
||||||
|
PendingDeprecationWarning, stacklevel=2
|
||||||
|
)
|
||||||
|
super(SingleObjectAPIView, self).__init__(*args, **kwargs)
|
||||||
|
|
|
@ -26,9 +26,11 @@ class BasePermission(object):
|
||||||
Return `True` if permission is granted, `False` otherwise.
|
Return `True` if permission is granted, `False` otherwise.
|
||||||
"""
|
"""
|
||||||
if len(inspect.getargspec(self.has_permission).args) == 4:
|
if len(inspect.getargspec(self.has_permission).args) == 4:
|
||||||
warnings.warn('The `obj` argument in `has_permission` is due to be deprecated. '
|
warnings.warn(
|
||||||
|
'The `obj` argument in `has_permission` is deprecated. '
|
||||||
'Use `has_object_permission()` instead for object permissions.',
|
'Use `has_object_permission()` instead for object permissions.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2
|
||||||
|
)
|
||||||
return self.has_permission(request, view, obj)
|
return self.has_permission(request, view, obj)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,9 @@ class RelatedField(WritableField):
|
||||||
|
|
||||||
# 'null' is to be deprecated in favor of 'required'
|
# 'null' is to be deprecated in favor of 'required'
|
||||||
if 'null' in kwargs:
|
if 'null' in kwargs:
|
||||||
warnings.warn('The `null` keyword argument is due to be deprecated. '
|
warnings.warn('The `null` keyword argument is deprecated. '
|
||||||
'Use the `required` keyword argument instead.',
|
'Use the `required` keyword argument instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['required'] = not kwargs.pop('null')
|
kwargs['required'] = not kwargs.pop('null')
|
||||||
|
|
||||||
self.queryset = kwargs.pop('queryset', None)
|
self.queryset = kwargs.pop('queryset', None)
|
||||||
|
@ -328,9 +328,9 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
|
|
||||||
if request is None:
|
if request is None:
|
||||||
warnings.warn("Using `HyperlinkedRelatedField` without including the "
|
warnings.warn("Using `HyperlinkedRelatedField` without including the "
|
||||||
"request in the serializer context is due to be deprecated. "
|
"request in the serializer context is deprecated. "
|
||||||
"Add `context={'request': request}` when instantiating the serializer.",
|
"Add `context={'request': request}` when instantiating the serializer.",
|
||||||
PendingDeprecationWarning, stacklevel=4)
|
DeprecationWarning, stacklevel=4)
|
||||||
|
|
||||||
pk = getattr(obj, 'pk', None)
|
pk = getattr(obj, 'pk', None)
|
||||||
if pk is None:
|
if pk is None:
|
||||||
|
@ -443,9 +443,9 @@ class HyperlinkedIdentityField(Field):
|
||||||
|
|
||||||
if request is None:
|
if request is None:
|
||||||
warnings.warn("Using `HyperlinkedIdentityField` without including the "
|
warnings.warn("Using `HyperlinkedIdentityField` without including the "
|
||||||
"request in the serializer context is due to be deprecated. "
|
"request in the serializer context is deprecated. "
|
||||||
"Add `context={'request': request}` when instantiating the serializer.",
|
"Add `context={'request': request}` when instantiating the serializer.",
|
||||||
PendingDeprecationWarning, stacklevel=4)
|
DeprecationWarning, stacklevel=4)
|
||||||
|
|
||||||
# By default use whatever format is given for the current context
|
# By default use whatever format is given for the current context
|
||||||
# unless the target is a different type to the source.
|
# unless the target is a different type to the source.
|
||||||
|
@ -488,35 +488,35 @@ class HyperlinkedIdentityField(Field):
|
||||||
|
|
||||||
class ManyRelatedField(RelatedField):
|
class ManyRelatedField(RelatedField):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
warnings.warn('`ManyRelatedField()` is due to be deprecated. '
|
warnings.warn('`ManyRelatedField()` is deprecated. '
|
||||||
'Use `RelatedField(many=True)` instead.',
|
'Use `RelatedField(many=True)` instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['many'] = True
|
kwargs['many'] = True
|
||||||
super(ManyRelatedField, self).__init__(*args, **kwargs)
|
super(ManyRelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ManyPrimaryKeyRelatedField(PrimaryKeyRelatedField):
|
class ManyPrimaryKeyRelatedField(PrimaryKeyRelatedField):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
warnings.warn('`ManyPrimaryKeyRelatedField()` is due to be deprecated. '
|
warnings.warn('`ManyPrimaryKeyRelatedField()` is deprecated. '
|
||||||
'Use `PrimaryKeyRelatedField(many=True)` instead.',
|
'Use `PrimaryKeyRelatedField(many=True)` instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['many'] = True
|
kwargs['many'] = True
|
||||||
super(ManyPrimaryKeyRelatedField, self).__init__(*args, **kwargs)
|
super(ManyPrimaryKeyRelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ManySlugRelatedField(SlugRelatedField):
|
class ManySlugRelatedField(SlugRelatedField):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
warnings.warn('`ManySlugRelatedField()` is due to be deprecated. '
|
warnings.warn('`ManySlugRelatedField()` is deprecated. '
|
||||||
'Use `SlugRelatedField(many=True)` instead.',
|
'Use `SlugRelatedField(many=True)` instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['many'] = True
|
kwargs['many'] = True
|
||||||
super(ManySlugRelatedField, self).__init__(*args, **kwargs)
|
super(ManySlugRelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ManyHyperlinkedRelatedField(HyperlinkedRelatedField):
|
class ManyHyperlinkedRelatedField(HyperlinkedRelatedField):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
warnings.warn('`ManyHyperlinkedRelatedField()` is due to be deprecated. '
|
warnings.warn('`ManyHyperlinkedRelatedField()` is deprecated. '
|
||||||
'Use `HyperlinkedRelatedField(many=True)` instead.',
|
'Use `HyperlinkedRelatedField(many=True)` instead.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['many'] = True
|
kwargs['many'] = True
|
||||||
super(ManyHyperlinkedRelatedField, self).__init__(*args, **kwargs)
|
super(ManyHyperlinkedRelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
|
@ -13,6 +13,8 @@ For example, you might have a `urls.py` that looks something like this:
|
||||||
|
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from django.conf.urls import url, patterns
|
from django.conf.urls import url, patterns
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
|
@ -436,9 +436,9 @@ class BaseSerializer(WritableField):
|
||||||
else:
|
else:
|
||||||
many = hasattr(data, '__iter__') and not isinstance(data, (Page, dict, six.text_type))
|
many = hasattr(data, '__iter__') and not isinstance(data, (Page, dict, six.text_type))
|
||||||
if many:
|
if many:
|
||||||
warnings.warn('Implict list/queryset serialization is due to be deprecated. '
|
warnings.warn('Implict list/queryset serialization is deprecated. '
|
||||||
'Use the `many=True` flag when instantiating the serializer.',
|
'Use the `many=True` flag when instantiating the serializer.',
|
||||||
PendingDeprecationWarning, stacklevel=3)
|
DeprecationWarning, stacklevel=3)
|
||||||
|
|
||||||
if many:
|
if many:
|
||||||
ret = []
|
ret = []
|
||||||
|
@ -498,9 +498,9 @@ class BaseSerializer(WritableField):
|
||||||
else:
|
else:
|
||||||
many = hasattr(obj, '__iter__') and not isinstance(obj, (Page, dict))
|
many = hasattr(obj, '__iter__') and not isinstance(obj, (Page, dict))
|
||||||
if many:
|
if many:
|
||||||
warnings.warn('Implict list/queryset serialization is due to be deprecated. '
|
warnings.warn('Implict list/queryset serialization is deprecated. '
|
||||||
'Use the `many=True` flag when instantiating the serializer.',
|
'Use the `many=True` flag when instantiating the serializer.',
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
if many:
|
if many:
|
||||||
self._data = [self.to_native(item) for item in obj]
|
self._data = [self.to_native(item) for item in obj]
|
||||||
|
@ -606,13 +606,25 @@ class ModelSerializer(Serializer):
|
||||||
|
|
||||||
if model_field.rel and nested:
|
if model_field.rel and nested:
|
||||||
if len(inspect.getargspec(self.get_nested_field).args) == 2:
|
if len(inspect.getargspec(self.get_nested_field).args) == 2:
|
||||||
# TODO: deprecation warning
|
warnings.warn(
|
||||||
|
'The `get_nested_field(model_field)` call signature '
|
||||||
|
'is due to be deprecated. '
|
||||||
|
'Use `get_nested_field(model_field, related_model, '
|
||||||
|
'to_many) instead',
|
||||||
|
PendingDeprecationWarning
|
||||||
|
)
|
||||||
field = self.get_nested_field(model_field)
|
field = self.get_nested_field(model_field)
|
||||||
else:
|
else:
|
||||||
field = self.get_nested_field(model_field, related_model, to_many)
|
field = self.get_nested_field(model_field, related_model, to_many)
|
||||||
elif model_field.rel:
|
elif model_field.rel:
|
||||||
if len(inspect.getargspec(self.get_nested_field).args) == 3:
|
if len(inspect.getargspec(self.get_nested_field).args) == 3:
|
||||||
# TODO: deprecation warning
|
warnings.warn(
|
||||||
|
'The `get_related_field(model_field, to_many)` call '
|
||||||
|
'signature is due to be deprecated. '
|
||||||
|
'Use `get_related_field(model_field, related_model, '
|
||||||
|
'to_many) instead',
|
||||||
|
PendingDeprecationWarning
|
||||||
|
)
|
||||||
field = self.get_related_field(model_field, to_many=to_many)
|
field = self.get_related_field(model_field, to_many=to_many)
|
||||||
else:
|
else:
|
||||||
field = self.get_related_field(model_field, related_model, to_many)
|
field = self.get_related_field(model_field, related_model, to_many)
|
||||||
|
|
|
@ -357,7 +357,6 @@ class CustomValidationTests(TestCase):
|
||||||
|
|
||||||
def validate_email(self, attrs, source):
|
def validate_email(self, attrs, source):
|
||||||
value = attrs[source]
|
value = attrs[source]
|
||||||
|
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
def validate_content(self, attrs, source):
|
def validate_content(self, attrs, source):
|
||||||
|
@ -1103,7 +1102,7 @@ class DeserializeListTestCase(TestCase):
|
||||||
|
|
||||||
def test_no_errors(self):
|
def test_no_errors(self):
|
||||||
data = [self.data.copy() for x in range(0, 3)]
|
data = [self.data.copy() for x in range(0, 3)]
|
||||||
serializer = CommentSerializer(data=data)
|
serializer = CommentSerializer(data=data, many=True)
|
||||||
self.assertTrue(serializer.is_valid())
|
self.assertTrue(serializer.is_valid())
|
||||||
self.assertTrue(isinstance(serializer.object, list))
|
self.assertTrue(isinstance(serializer.object, list))
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
|
@ -1115,7 +1114,7 @@ class DeserializeListTestCase(TestCase):
|
||||||
invalid_item['email'] = ''
|
invalid_item['email'] = ''
|
||||||
data = [self.data.copy(), invalid_item, self.data.copy()]
|
data = [self.data.copy(), invalid_item, self.data.copy()]
|
||||||
|
|
||||||
serializer = CommentSerializer(data=data)
|
serializer = CommentSerializer(data=data, many=True)
|
||||||
self.assertFalse(serializer.is_valid())
|
self.assertFalse(serializer.is_valid())
|
||||||
expected = [{}, {'email': ['This field is required.']}, {}]
|
expected = [{}, {'email': ['This field is required.']}, {}]
|
||||||
self.assertEqual(serializer.errors, expected)
|
self.assertEqual(serializer.errors, expected)
|
||||||
|
|
|
@ -109,7 +109,7 @@ class WritableNestedSerializerBasicTests(TestCase):
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
serializer = self.AlbumSerializer(data=data)
|
serializer = self.AlbumSerializer(data=data, many=True)
|
||||||
self.assertEqual(serializer.is_valid(), False)
|
self.assertEqual(serializer.is_valid(), False)
|
||||||
self.assertEqual(serializer.errors, expected_errors)
|
self.assertEqual(serializer.errors, expected_errors)
|
||||||
|
|
||||||
|
@ -241,6 +241,6 @@ class WritableNestedSerializerObjectTests(TestCase):
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
serializer = self.AlbumSerializer(data=data)
|
serializer = self.AlbumSerializer(data=data, many=True)
|
||||||
self.assertEqual(serializer.is_valid(), True)
|
self.assertEqual(serializer.is_valid(), True)
|
||||||
self.assertEqual(serializer.object, expected_object)
|
self.assertEqual(serializer.object, expected_object)
|
||||||
|
|
|
@ -16,6 +16,8 @@ automatically.
|
||||||
router.register(r'users', UserViewSet, 'user')
|
router.register(r'users', UserViewSet, 'user')
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from functools import update_wrapper
|
from functools import update_wrapper
|
||||||
from django.utils.decorators import classonlymethod
|
from django.utils.decorators import classonlymethod
|
||||||
from rest_framework import views, generics, mixins
|
from rest_framework import views, generics, mixins
|
||||||
|
|
Loading…
Reference in New Issue
Block a user