|
8 | 8 | from rest_framework import status, exceptions
|
9 | 9 | from rest_framework.compat import View
|
10 | 10 | from rest_framework.response import Response
|
11 |
| -from rest_framework.request import Request |
| 11 | +from rest_framework.request import clone_request, Request |
12 | 12 | from rest_framework.settings import api_settings
|
13 | 13 | from rest_framework.utils.formatting import get_view_name, get_view_description
|
14 | 14 |
|
@@ -52,19 +52,42 @@ def default_response_headers(self):
|
52 | 52 | }
|
53 | 53 |
|
54 | 54 | def metadata(self, request):
|
55 |
| - return { |
| 55 | + content = { |
56 | 56 | 'name': get_view_name(self.__class__),
|
57 | 57 | 'description': get_view_description(self.__class__),
|
58 | 58 | 'renders': [renderer.media_type for renderer in self.renderer_classes],
|
59 | 59 | 'parses': [parser.media_type for parser in self.parser_classes],
|
60 | 60 | }
|
61 |
| - # TODO: Add 'fields', from serializer info, if it exists. |
62 |
| - # serializer = self.get_serializer() |
63 |
| - # if serializer is not None: |
64 |
| - # field_name_types = {} |
65 |
| - # for name, field in form.fields.iteritems(): |
66 |
| - # field_name_types[name] = field.__class__.__name__ |
67 |
| - # content['fields'] = field_name_types |
| 61 | + action_metadata = self._generate_action_metadata(request) |
| 62 | + if action_metadata is not None: |
| 63 | + content['actions'] = action_metadata |
| 64 | + |
| 65 | + return content |
| 66 | + |
| 67 | + def _generate_action_metadata(self, request): |
| 68 | + ''' |
| 69 | + Helper for generating the fields metadata for allowed and permitted methods. |
| 70 | + ''' |
| 71 | + actions = {} |
| 72 | + |
| 73 | + for method in self.allowed_methods: |
| 74 | + cloned_request = clone_request(request, method) |
| 75 | + try: |
| 76 | + self.check_permissions(cloned_request) |
| 77 | + |
| 78 | + # TODO: find right placement - APIView does not have get_serializer |
| 79 | + serializer = self.get_serializer() |
| 80 | + if serializer is not None: |
| 81 | + field_name_types = {} |
| 82 | + for name, field in serializer.fields.iteritems(): |
| 83 | + field_name_types[name] = field.__class__.__name__ |
| 84 | + |
| 85 | + actions[method] = field_name_types |
| 86 | + except: |
| 87 | + # don't add this method |
| 88 | + pass |
| 89 | + |
| 90 | + return actions if len(actions) > 0 else None |
68 | 91 |
|
69 | 92 | def http_method_not_allowed(self, request, *args, **kwargs):
|
70 | 93 | """
|
|
0 commit comments