diff options
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/generics.py | 27 | ||||
| -rw-r--r-- | rest_framework/mixins.py | 25 | ||||
| -rw-r--r-- | rest_framework/views.py | 23 | 
3 files changed, 35 insertions, 40 deletions
| diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 51874f28..59739d01 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -96,7 +96,6 @@ class SingleObjectBaseView(SingleObjectMixin, BaseView):  ### by composing the mixin classes with a base view.   ###  class ListAPIView(mixins.ListModelMixin, -                  mixins.MetadataMixin,                    MultipleObjectBaseView):      """      Concrete view for listing a queryset. @@ -104,13 +103,9 @@ class ListAPIView(mixins.ListModelMixin,      def get(self, request, *args, **kwargs):          return self.list(request, *args, **kwargs) -    def options(self, request, *args, **kwargs): -        return self.metadata(request, *args, **kwargs) -  class ListCreateAPIView(mixins.ListModelMixin,                          mixins.CreateModelMixin, -                        mixins.MetadataMixin,                          MultipleObjectBaseView):      """      Concrete view for listing a queryset or creating a model instance. @@ -121,12 +116,8 @@ class ListCreateAPIView(mixins.ListModelMixin,      def post(self, request, *args, **kwargs):          return self.create(request, *args, **kwargs) -    def options(self, request, *args, **kwargs): -        return self.metadata(request, *args, **kwargs) -  class RetrieveAPIView(mixins.RetrieveModelMixin, -                      mixins.MetadataMixin,                        SingleObjectBaseView):      """      Concrete view for retrieving a model instance. @@ -134,14 +125,23 @@ class RetrieveAPIView(mixins.RetrieveModelMixin,      def get(self, request, *args, **kwargs):          return self.retrieve(request, *args, **kwargs) -    def options(self, request, *args, **kwargs): -        return self.metadata(request, *args, **kwargs) + +class RetrieveDestroyAPIView(mixins.RetrieveModelMixin, +                             mixins.DestroyModelMixin, +                             SingleObjectBaseView): +    """ +    Concrete view for retrieving or deleting a model instance. +    """ +    def get(self, request, *args, **kwargs): +        return self.retrieve(request, *args, **kwargs) + +    def delete(self, request, *args, **kwargs): +        return self.destroy(request, *args, **kwargs)  class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,                                     mixins.UpdateModelMixin,                                     mixins.DestroyModelMixin, -                                   mixins.MetadataMixin,                                     SingleObjectBaseView):      """      Concrete view for retrieving, updating or deleting a model instance. @@ -154,6 +154,3 @@ class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,      def delete(self, request, *args, **kwargs):          return self.destroy(request, *args, **kwargs) - -    def options(self, request, *args, **kwargs): -        return self.metadata(request, *args, **kwargs) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index 7cfbe030..29153e18 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -112,28 +112,3 @@ class DestroyModelMixin(object):          self.object = self.get_object()          self.object.delete()          return Response(status=status.HTTP_204_NO_CONTENT) - - -# TODO: Remove MetadataMixin, and implement on APIView.options() -class MetadataMixin(object): -    """ -    Return a dicitonary of view metadata. -    Should be mixed in with any `BaseView`. - -    This mixin is typically used for the HTTP 'OPTIONS' method. -    """ -    def metadata(self, request, *args, **kwargs): -        content = { -            'name': self.get_name(), -            'description': self.get_description(), -            'renders': [renderer.media_type for renderer in self.renderer_classes], -            'parses': [parser.media_type for parser in self.parser_classes], -        } -        #  TODO: Add 'fields', from serializer info. -        # serializer = self.get_serializer() -        # if serializer is not None: -        #     field_name_types = {} -        #     for name, field in form.fields.iteritems(): -        #         field_name_types[name] = field.__class__.__name__ -        #     content['fields'] = field_name_types -        return Response(content, status=status.HTTP_200_OK) diff --git a/rest_framework/views.py b/rest_framework/views.py index 0aa1dd0d..790c76fa 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -124,6 +124,21 @@ class APIView(View):              description = escape(description).replace('\n', '<br />')          return mark_safe(description) +    def metadata(self, request): +        return { +            'name': self.get_name(), +            'description': self.get_description(), +            'renders': [renderer.media_type for renderer in self.renderer_classes], +            'parses': [parser.media_type for parser in self.parser_classes], +        } +        #  TODO: Add 'fields', from serializer info, if it exists. +        # serializer = self.get_serializer() +        # if serializer is not None: +        #     field_name_types = {} +        #     for name, field in form.fields.iteritems(): +        #         field_name_types[name] = field.__class__.__name__ +        #     content['fields'] = field_name_types +      def http_method_not_allowed(self, request, *args, **kwargs):          """          Called if `request.method` does not corrospond to a handler method. @@ -309,3 +324,11 @@ class APIView(View):          self.response = self.finalize_response(request, response, *args, **kwargs)          return self.response + +    def options(self, request, *args, **kwargs): +        """ +        Handler method for HTTP 'OPTIONS' request. +        We may as well implement this as Django will otherwise provide +        a less useful default implementation. +        """ +        return Response(self.metadata(request), status=status.HTTP_200_OK) | 
