diff options
| -rw-r--r-- | rest_framework/fields.py | 4 | ||||
| -rw-r--r-- | rest_framework/generics.py | 60 | ||||
| -rw-r--r-- | rest_framework/permissions.py | 8 | ||||
| -rw-r--r-- | rest_framework/relations.py | 28 | ||||
| -rw-r--r-- | rest_framework/routers.py | 2 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 24 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 5 | ||||
| -rw-r--r-- | rest_framework/tests/serializer_nested.py | 4 | ||||
| -rw-r--r-- | rest_framework/viewsets.py | 2 | 
9 files changed, 93 insertions, 44 deletions
| diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 38fe025d..f934fc39 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -200,9 +200,9 @@ class WritableField(Field):          # 'blank' is to be deprecated in favor of 'required'          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.', -                          PendingDeprecationWarning, stacklevel=2) +                          DeprecationWarning, stacklevel=2)              required = not(blank)          super(WritableField, self).__init__(source=source) diff --git a/rest_framework/generics.py b/rest_framework/generics.py index a18584d4..972424e6 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -2,13 +2,16 @@  Generic views that provide commonly needed behaviour.  """  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.paginator import Paginator, InvalidPage  from django.http import Http404  from django.shortcuts import get_object_or_404  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): @@ -94,7 +97,12 @@ class GenericAPIView(views.APIView):          """          deprecated_style = False          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          else:              # Determine the required page size. @@ -155,7 +163,9 @@ class GenericAPIView(views.APIView):          Otherwise defaults to using `self.paginate_by`.          """          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:              query_params = self.request.QUERY_PARAMS @@ -226,17 +236,27 @@ class GenericAPIView(views.APIView):          if lookup is not None:              filter_kwargs = {self.lookup_field: lookup} -        elif pk is not None: -            # TODO: Deprecation warning +        elif pk is not None and self.lookup_field == 'pk': +            warnings.warn( +                'The `pk_url_kwarg` attribute is due to be deprecated. ' +                'Use the `lookup_field` attribute instead', +                PendingDeprecationWarning +            )              filter_kwargs = {'pk': pk} -        elif slug is not None: -            # TODO: Deprecation warning +        elif slug is not None and self.lookup_field == 'pk': +            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}          else: -            # TODO: Fix error message -            raise AttributeError("Generic detail view %s must be called with " -                                 "either an object pk or a slug." -                                 % self.__class__.__name__) +            raise ConfigurationError( +                'Expected view %s to be called with a URL keyword argument ' +                'named "%s". Fix your URL conf, or set the `.lookup_field` ' +                'attribute on the view correctly.' % +                (self.__class__.__name__, self.lookup_field) +            )          obj = get_object_or_404(queryset, **filter_kwargs) @@ -391,8 +411,20 @@ class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,  ##########################  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): -    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) diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 2aa45c71..91bf5ad6 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -26,9 +26,11 @@ class BasePermission(object):          Return `True` if permission is granted, `False` otherwise.          """          if len(inspect.getargspec(self.has_permission).args) == 4: -            warnings.warn('The `obj` argument in `has_permission` is due to be deprecated. ' -                      'Use `has_object_permission()` instead for object permissions.', -                       PendingDeprecationWarning, stacklevel=2) +            warnings.warn( +                'The `obj` argument in `has_permission` is deprecated. ' +                'Use `has_object_permission()` instead for object permissions.', +                DeprecationWarning, stacklevel=2 +            )              return self.has_permission(request, view, obj)          return True diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 6bda7418..abe5203b 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -42,9 +42,9 @@ class RelatedField(WritableField):          # 'null' is to be deprecated in favor of 'required'          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.', -                          PendingDeprecationWarning, stacklevel=2) +                          DeprecationWarning, stacklevel=2)              kwargs['required'] = not kwargs.pop('null')          self.queryset = kwargs.pop('queryset', None) @@ -328,9 +328,9 @@ class HyperlinkedRelatedField(RelatedField):          if request is None:              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.", -                          PendingDeprecationWarning, stacklevel=4) +                          DeprecationWarning, stacklevel=4)          pk = getattr(obj, 'pk', None)          if pk is None: @@ -443,9 +443,9 @@ class HyperlinkedIdentityField(Field):          if request is None:              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.", -                          PendingDeprecationWarning, stacklevel=4) +                          DeprecationWarning, stacklevel=4)          # By default use whatever format is given for the current context          # unless the target is a different type to the source. @@ -488,35 +488,35 @@ class HyperlinkedIdentityField(Field):  class ManyRelatedField(RelatedField):      def __init__(self, *args, **kwargs): -        warnings.warn('`ManyRelatedField()` is due to be deprecated. ' +        warnings.warn('`ManyRelatedField()` is deprecated. '                        'Use `RelatedField(many=True)` instead.', -                       PendingDeprecationWarning, stacklevel=2) +                       DeprecationWarning, stacklevel=2)          kwargs['many'] = True          super(ManyRelatedField, self).__init__(*args, **kwargs)  class ManyPrimaryKeyRelatedField(PrimaryKeyRelatedField):      def __init__(self, *args, **kwargs): -        warnings.warn('`ManyPrimaryKeyRelatedField()` is due to be deprecated. ' +        warnings.warn('`ManyPrimaryKeyRelatedField()` is deprecated. '                        'Use `PrimaryKeyRelatedField(many=True)` instead.', -                       PendingDeprecationWarning, stacklevel=2) +                       DeprecationWarning, stacklevel=2)          kwargs['many'] = True          super(ManyPrimaryKeyRelatedField, self).__init__(*args, **kwargs)  class ManySlugRelatedField(SlugRelatedField):      def __init__(self, *args, **kwargs): -        warnings.warn('`ManySlugRelatedField()` is due to be deprecated. ' +        warnings.warn('`ManySlugRelatedField()` is deprecated. '                        'Use `SlugRelatedField(many=True)` instead.', -                       PendingDeprecationWarning, stacklevel=2) +                       DeprecationWarning, stacklevel=2)          kwargs['many'] = True          super(ManySlugRelatedField, self).__init__(*args, **kwargs)  class ManyHyperlinkedRelatedField(HyperlinkedRelatedField):      def __init__(self, *args, **kwargs): -        warnings.warn('`ManyHyperlinkedRelatedField()` is due to be deprecated. ' +        warnings.warn('`ManyHyperlinkedRelatedField()` is deprecated. '                        'Use `HyperlinkedRelatedField(many=True)` instead.', -                       PendingDeprecationWarning, stacklevel=2) +                       DeprecationWarning, stacklevel=2)          kwargs['many'] = True          super(ManyHyperlinkedRelatedField, self).__init__(*args, **kwargs) diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 33e88a81..2bbf519c 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -13,6 +13,8 @@ For example, you might have a `urls.py` that looks something like this:      urlpatterns = router.urls  """ +from __future__ import unicode_literals +  from collections import namedtuple  from django.conf.urls import url, patterns  from django.db import models diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 3d956e4d..3afb7475 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -436,9 +436,9 @@ class BaseSerializer(WritableField):              else:                  many = hasattr(data, '__iter__') and not isinstance(data, (Page, dict, six.text_type))                  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.', -                                  PendingDeprecationWarning, stacklevel=3) +                                  DeprecationWarning, stacklevel=3)              if many:                  ret = [] @@ -498,9 +498,9 @@ class BaseSerializer(WritableField):              else:                  many = hasattr(obj, '__iter__') and not isinstance(obj, (Page, dict))                  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.', -                                  PendingDeprecationWarning, stacklevel=2) +                                  DeprecationWarning, stacklevel=2)              if many:                  self._data = [self.to_native(item) for item in obj] @@ -606,13 +606,25 @@ class ModelSerializer(Serializer):              if model_field.rel and nested:                  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)                  else:                      field = self.get_nested_field(model_field, related_model, to_many)              elif model_field.rel:                  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)                  else:                      field = self.get_related_field(model_field, related_model, to_many) diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 3a94fad5..ae8d09dc 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -357,7 +357,6 @@ class CustomValidationTests(TestCase):          def validate_email(self, attrs, source):              value = attrs[source] -              return attrs          def validate_content(self, attrs, source): @@ -1103,7 +1102,7 @@ class DeserializeListTestCase(TestCase):      def test_no_errors(self):          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(isinstance(serializer.object, list))          self.assertTrue( @@ -1115,7 +1114,7 @@ class DeserializeListTestCase(TestCase):          invalid_item['email'] = ''          data = [self.data.copy(), invalid_item, self.data.copy()] -        serializer = CommentSerializer(data=data) +        serializer = CommentSerializer(data=data, many=True)          self.assertFalse(serializer.is_valid())          expected = [{}, {'email': ['This field is required.']}, {}]          self.assertEqual(serializer.errors, expected) diff --git a/rest_framework/tests/serializer_nested.py b/rest_framework/tests/serializer_nested.py index 6a29c652..71d0e24b 100644 --- a/rest_framework/tests/serializer_nested.py +++ b/rest_framework/tests/serializer_nested.py @@ -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.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.object, expected_object) diff --git a/rest_framework/viewsets.py b/rest_framework/viewsets.py index bd25df77..a54467d7 100644 --- a/rest_framework/viewsets.py +++ b/rest_framework/viewsets.py @@ -16,6 +16,8 @@ automatically.      router.register(r'users', UserViewSet, 'user')      urlpatterns = router.urls  """ +from __future__ import unicode_literals +  from functools import update_wrapper  from django.utils.decorators import classonlymethod  from rest_framework import views, generics, mixins | 
