From 72842747068031b073e0b440e069dee2dacdfeec Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 27 Jul 2016 11:31:37 +0100 Subject: [PATCH] Fix json indent parameter. Closes #4281 --- docs/api-guide/schemas.md | 2 +- rest_framework/response.py | 4 +++- rest_framework/routers.py | 2 ++ tests/test_negotiation.py | 13 ++++++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index 6585801e7..8abd74646 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -241,7 +241,7 @@ to the Open API ("Swagger") format: from openapi_codec import OpenAPICodec class SwaggerRenderer(renderers.BaseRenderer): - media_type = 'application/openapi+json;version=2.0' + media_type = 'application/openapi+json' format = 'swagger' def render(self, data, media_type=None, renderer_context=None): diff --git a/rest_framework/response.py b/rest_framework/response.py index ab8aff114..4b863cb99 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -51,9 +51,11 @@ class Response(SimpleTemplateResponse): @property def rendered_content(self): renderer = getattr(self, 'accepted_renderer', None) + accepted_media_type = getattr(self, 'accepted_media_type', None) context = getattr(self, 'renderer_context', None) assert renderer, ".accepted_renderer not set on Response" + assert accepted_media_type, ".accepted_media_type not set on Response" assert context, ".renderer_context not set on Response" context['response'] = self @@ -67,7 +69,7 @@ class Response(SimpleTemplateResponse): content_type = media_type self['Content-Type'] = content_type - ret = renderer.render(self.data, media_type, context) + ret = renderer.render(self.data, accepted_media_type, context) if isinstance(ret, six.text_type): assert charset, ( 'renderer returned unicode, and did not specify ' diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 69d73e842..9561fa4db 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -276,6 +276,8 @@ class DefaultRouter(SimpleRouter): default_schema_renderers = [renderers.CoreJSONRenderer] def __init__(self, *args, **kwargs): + if 'schema_renderers' in kwargs: + assert 'schema_title' in kwargs, 'Missing "schema_title" argument.' self.schema_title = kwargs.pop('schema_title', None) self.schema_renderers = kwargs.pop('schema_renderers', self.default_schema_renderers) super(DefaultRouter, self).__init__(*args, **kwargs) diff --git a/tests/test_negotiation.py b/tests/test_negotiation.py index 434fba496..96ef83eab 100644 --- a/tests/test_negotiation.py +++ b/tests/test_negotiation.py @@ -10,6 +10,11 @@ from rest_framework.test import APIRequestFactory factory = APIRequestFactory() +class MockOpenAPIRenderer(BaseRenderer): + media_type = 'application/openapi+json;version=2.0' + format = 'swagger' + + class MockJSONRenderer(BaseRenderer): media_type = 'application/json' @@ -24,7 +29,7 @@ class NoCharsetSpecifiedRenderer(BaseRenderer): class TestAcceptedMediaType(TestCase): def setUp(self): - self.renderers = [MockJSONRenderer(), MockHTMLRenderer()] + self.renderers = [MockJSONRenderer(), MockHTMLRenderer(), MockOpenAPIRenderer()] self.negotiator = DefaultContentNegotiation() def select_renderer(self, request): @@ -44,3 +49,9 @@ class TestAcceptedMediaType(TestCase): request = Request(factory.get('/', HTTP_ACCEPT='application/json; indent=8')) accepted_renderer, accepted_media_type = self.select_renderer(request) self.assertEqual(accepted_media_type, 'application/json; indent=8') + + def test_client_specifies_parameter(self): + request = Request(factory.get('/', HTTP_ACCEPT='application/openapi+json;version=2.0')) + accepted_renderer, accepted_media_type = self.select_renderer(request) + self.assertEqual(accepted_media_type, 'application/openapi+json;version=2.0') + self.assertEqual(accepted_renderer.format, 'swagger')