diff --git a/rest_framework/generics.py b/rest_framework/generics.py index aea636f15..117c98ade 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -388,10 +388,11 @@ class GenericAPIView(views.APIView): if method not in self.allowed_methods: continue - cloned_request = clone_request(request, method) + original_request = clone_request(request, request.method) + 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: @@ -409,6 +410,7 @@ class GenericAPIView(views.APIView): # appropriate metadata about the fields that should be supplied. serializer = self.get_serializer() actions[method] = serializer.metadata() + self.request = original_request if actions: ret['actions'] = actions diff --git a/rest_framework/runtests/runtests.py b/rest_framework/runtests/runtests.py index 2daaae4ee..55eabfaa8 100755 --- a/rest_framework/runtests/runtests.py +++ b/rest_framework/runtests/runtests.py @@ -43,7 +43,6 @@ def main(): test_module_name = 'rest_framework.tests' if django.VERSION[0] == 1 and django.VERSION[1] < 6: test_module_name = 'tests' - failures = test_runner.run_tests([test_module_name + test_case]) sys.exit(failures) diff --git a/rest_framework/tests/test_generics.py b/rest_framework/tests/test_generics.py index 57d327cc6..1b97efd3a 100644 --- a/rest_framework/tests/test_generics.py +++ b/rest_framework/tests/test_generics.py @@ -681,3 +681,31 @@ 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': 'string', + 'required': True, + 'read_only': False, + 'label': 'field b', + 'max_length': 100 + } + } + } + } + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, expected)