2.2's PendingDeprecationWarnings now become DeprecationWarnings. 2.3's PendingDeprecationWarnings added.

This commit is contained in:
Tom Christie 2013-04-29 12:45:00 +01:00
parent 70831ad0bb
commit dc7b1d6430
9 changed files with 93 additions and 44 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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(
'Use `has_object_permission()` instead for object permissions.', 'The `obj` argument in `has_permission` is deprecated. '
PendingDeprecationWarning, stacklevel=2) 'Use `has_object_permission()` instead for object permissions.',
DeprecationWarning, stacklevel=2
)
return self.has_permission(request, view, obj) return self.has_permission(request, view, obj)
return True return True

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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