Commit dc7b1d64 by Tom Christie

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

2.2's PendingDeprecationWarnings now become DeprecationWarnings.  2.3's PendingDeprecationWarnings added.
parent 70831ad0
...@@ -200,9 +200,9 @@ class WritableField(Field): ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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, ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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: ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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. ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment