diff options
| -rw-r--r-- | rest_framework/generics.py | 7 | ||||
| -rw-r--r-- | tests/test_generics.py | 39 | 
2 files changed, 44 insertions, 2 deletions
| diff --git a/rest_framework/generics.py b/rest_framework/generics.py index a6f68657..a62da00b 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -398,10 +398,11 @@ class GenericAPIView(views.APIView):              if method not in self.allowed_methods:                  continue -            cloned_request = clone_request(request, method) +            original_request = self.request +            self.request = clone_request(request, method)              try:                  # Test global permissions -                self.check_permissions(cloned_request) +                self.check_permissions(self.request)                  # Test object permissions                  if method == 'PUT':                      try: @@ -419,6 +420,8 @@ class GenericAPIView(views.APIView):                  # appropriate metadata about the fields that should be supplied.                  serializer = self.get_serializer()                  actions[method] = serializer.metadata() +            finally: +                self.request = original_request          if actions:              ret['actions'] = actions diff --git a/tests/test_generics.py b/tests/test_generics.py index e9f5bebd..dd3bab18 100644 --- a/tests/test_generics.py +++ b/tests/test_generics.py @@ -681,3 +681,42 @@ class TestFilterBackendAppliedToViews(TestCase):          response = view(request).render()          self.assertContains(response, 'field_b')          self.assertNotContains(response, 'field_a') + +    def test_options_with_dynamic_serializer(self): +        """ +        Ensure that OPTIONS returns correct POST json schema: +        DynamicSerializer with single field 'field_b' +        """ +        request = factory.options('/') +        view = DynamicSerializerView.as_view() + +        with self.assertNumQueries(0): +            response = view(request).render() + +        expected = { +            'name': 'Dynamic Serializer', +            'description': '', +            'renders': [ +                'text/html', +                'application/json' +            ], +            'parses': [ +                'application/json', +                'application/x-www-form-urlencoded', +                'multipart/form-data' +            ], +            'actions': { +                'POST': { +                    'field_b': { +                        'type': u'string', +                        'required': True, +                        'read_only': False, +                        'label': u'field b', +                        'max_length': 100 +                    } +                } +            } +        } + +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(response.data, expected) | 
