diff options
Diffstat (limited to 'rest_framework/views.py')
| -rw-r--r-- | rest_framework/views.py | 64 | 
1 files changed, 14 insertions, 50 deletions
| diff --git a/rest_framework/views.py b/rest_framework/views.py index d1afbe89..e1b6705b 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -5,12 +5,11 @@ from __future__ import unicode_literals  from django.core.exceptions import PermissionDenied  from django.http import Http404, HttpResponse +from django.utils.datastructures import SortedDict  from django.views.decorators.csrf import csrf_exempt -  from rest_framework import status, exceptions  from rest_framework.compat import View -from rest_framework.fields import humanize_form_fields -from rest_framework.request import clone_request, Request +from rest_framework.request import Request  from rest_framework.response import Response  from rest_framework.settings import api_settings  from rest_framework.utils.formatting import get_view_name, get_view_description @@ -54,53 +53,6 @@ class APIView(View):              'Vary': 'Accept'          } -    def metadata(self, request): -        content = { -            'name': get_view_name(self.__class__), -            'description': get_view_description(self.__class__), -            'renders': [renderer.media_type for renderer in self.renderer_classes], -            'parses': [parser.media_type for parser in self.parser_classes], -        } -        content['actions'] = self.action_metadata(request) - -        return content - -    def action_metadata(self, request): -        """Return a dictionary with the fields required fo reach allowed method. If no method is allowed, -        return an empty dictionary. - -        :param request: Request for which to return the metadata of the allowed methods. -        :return: A dictionary of the form {method: {field: {field attribute: value}}} -        """ -        actions = {} -        for method in self.allowed_methods: -            # skip HEAD and OPTIONS -            if method in ('HEAD', 'OPTIONS'): -                continue - -            cloned_request = clone_request(request, method) -            try: -                self.check_permissions(cloned_request) - -                # TODO: discuss whether and how to expose parameters like e.g. filter or paginate -                if method in ('GET', 'DELETE'): -                    actions[method] = {} -                    continue - -                if not hasattr(self, 'get_serializer'): -                    continue -                serializer = self.get_serializer() -                if serializer is not None: -                    actions[method] = serializer.humanized -            except exceptions.PermissionDenied: -                # don't add this method -                pass -            except exceptions.NotAuthenticated: -                # don't add this method -                pass - -        return actions if len(actions) > 0 else None -      def http_method_not_allowed(self, request, *args, **kwargs):          """          If `request.method` does not correspond to a handler method, @@ -383,3 +335,15 @@ class APIView(View):          a less useful default implementation.          """          return Response(self.metadata(request), status=status.HTTP_200_OK) + +    def metadata(self, request): +        """ +        Return a dictionary of metadata about the view. +        Used to return responses for OPTIONS requests. +        """ +        ret = SortedDict() +        ret['name'] = get_view_name(self.__class__) +        ret['description'] = get_view_description(self.__class__) +        ret['renders'] = [renderer.media_type for renderer in self.renderer_classes] +        ret['parses'] = [parser.media_type for parser in self.parser_classes] +        return ret | 
