diff options
| author | Oscar Vilaplana | 2013-05-18 16:30:21 +0200 | 
|---|---|---|
| committer | Oscar Vilaplana | 2013-05-18 16:30:21 +0200 | 
| commit | 29739f78ba473112eeb0c1212b10085da07aa80b (patch) | |
| tree | cc3c00df1a64766758cd28563bdd1dc4146f841e /rest_framework/views.py | |
| parent | 4dbf2d907f9d5e86f7ecddc49a17e45d1f2d9367 (diff) | |
| parent | f8c1481d4b927d8cd16406d805597ded44bb3f1c (diff) | |
| download | django-rest-framework-29739f78ba473112eeb0c1212b10085da07aa80b.tar.bz2 | |
Merge branch 'issue-192-expose-fields-for-options' of github.com:nschlemm/django-rest-framework into http_debug_error_page_doc
Diffstat (limited to 'rest_framework/views.py')
| -rw-r--r-- | rest_framework/views.py | 41 | 
1 files changed, 32 insertions, 9 deletions
| diff --git a/rest_framework/views.py b/rest_framework/views.py index 555fa2f4..2dd2c59e 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -8,7 +8,7 @@ from django.views.decorators.csrf import csrf_exempt  from rest_framework import status, exceptions  from rest_framework.compat import View  from rest_framework.response import Response -from rest_framework.request import Request +from rest_framework.request import clone_request, Request  from rest_framework.settings import api_settings  from rest_framework.utils.formatting import get_view_name, get_view_description @@ -52,19 +52,42 @@ class APIView(View):          }      def metadata(self, request): -        return { +        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],          } -        #  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 +        action_metadata = self._generate_action_metadata(request) +        if action_metadata is not None: +            content['actions'] = action_metadata + +        return content + +    def _generate_action_metadata(self, request): +        ''' +        Helper for generating the fields metadata for allowed and permitted methods. +        ''' +        actions = {} + +        for method in self.allowed_methods: +            cloned_request = clone_request(request, method) +            try: +                self.check_permissions(cloned_request) + +                # TODO: find right placement - APIView does not have get_serializer +                serializer = self.get_serializer() +                if serializer is not None: +                    field_name_types = {} +                    for name, field in serializer.fields.iteritems(): +                        field_name_types[name] = field.__class__.__name__ + +                actions[method] = field_name_types +            except: +                # don't add this method +                pass + +        return actions if len(actions) > 0 else None      def http_method_not_allowed(self, request, *args, **kwargs):          """ | 
