From 207a7e2b2dc7120296f2edcff22c1b3570f16074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=20V=C3=AEjdea?= Date: Wed, 19 Sep 2018 21:56:36 +0300 Subject: [PATCH] Do not generate full schema in UI views --- .idea/drf-yasg.iml | 1 + docs/changelog.rst | 2 +- src/drf_yasg/renderers.py | 18 +++++++----------- src/drf_yasg/utils.py | 2 +- src/drf_yasg/views.py | 10 ++++++++-- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.idea/drf-yasg.iml b/.idea/drf-yasg.iml index 3b4a1b5..8a16a11 100644 --- a/.idea/drf-yasg.iml +++ b/.idea/drf-yasg.iml @@ -17,6 +17,7 @@ + diff --git a/docs/changelog.rst b/docs/changelog.rst index 0e94aa3..e676708 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -9,7 +9,7 @@ Changelog *Release date: Sep 13, 2018* -- **ADDED:** added the ``DISPLAY_OPERATION_ID `` ``swagger-ui`` setting +- **ADDED:** added the ``DISPLAY_OPERATION_ID`` ``swagger-ui`` setting - **IMPROVED:** updated ``ReDoc`` to version 2.0.0-alpha.38 - **IMPROVED:** Operation summary will now be parsed from multi-line view method docstrings (:issue:`205`) - **IMPROVED:** ``pattern`` will now work on any field with a ``RegexValidator`` diff --git a/src/drf_yasg/renderers.py b/src/drf_yasg/renderers.py index b1edc6f..2932337 100644 --- a/src/drf_yasg/renderers.py +++ b/src/drf_yasg/renderers.py @@ -28,7 +28,7 @@ class _SpecRenderer(BaseRenderer): if not isinstance(data, Swagger): # pragma: no cover # if `swagger` is not a ``Swagger`` object, it means we somehow got a non-success ``Response`` - # in that case, it's probably better to let the default ``TemplateHTMLRenderer`` render it + # in that case, it's probably better to let the default ``JSONRenderer`` render it # see https://github.com/axnsan12/drf-yasg/issues/58 return JSONRenderer().render(data, media_type, renderer_context) return codec.encode(data) @@ -68,15 +68,11 @@ class _UIRenderer(BaseRenderer): # see https://github.com/axnsan12/drf-yasg/issues/58 return TemplateHTMLRenderer().render(swagger, accepted_media_type, renderer_context) self.set_context(renderer_context, swagger) - return render( - renderer_context['request'], - self.template, - renderer_context - ) + return render(renderer_context['request'], self.template, renderer_context) - def set_context(self, renderer_context, swagger): - renderer_context['title'] = swagger.info.title - renderer_context['version'] = swagger.info.version + def set_context(self, renderer_context, swagger=None): + renderer_context['title'] = swagger.info.title or '' if swagger else '' + renderer_context['version'] = swagger.info.version or '' if swagger else '' renderer_context['oauth2_config'] = json.dumps(self.get_oauth2_config()) renderer_context['USE_SESSION_AUTH'] = swagger_settings.USE_SESSION_AUTH renderer_context.update(self.get_auth_urls()) @@ -119,7 +115,7 @@ class SwaggerUIRenderer(_UIRenderer): template = 'drf-yasg/swagger-ui.html' format = 'swagger' - def set_context(self, renderer_context, swagger): + def set_context(self, renderer_context, swagger=None): super(SwaggerUIRenderer, self).set_context(renderer_context, swagger) renderer_context['swagger_settings'] = json.dumps(self.get_swagger_ui_settings()) @@ -152,7 +148,7 @@ class ReDocRenderer(_UIRenderer): template = 'drf-yasg/redoc.html' format = 'redoc' - def set_context(self, renderer_context, swagger): + def set_context(self, renderer_context, swagger=None): super(ReDocRenderer, self).set_context(renderer_context, swagger) renderer_context['redoc_settings'] = json.dumps(self.get_redoc_settings()) diff --git a/src/drf_yasg/utils.py b/src/drf_yasg/utils.py index b14fce8..55cce59 100644 --- a/src/drf_yasg/utils.py +++ b/src/drf_yasg/utils.py @@ -273,7 +273,7 @@ def merge_params(parameters, overrides): def filter_none(obj): """Remove ``None`` values from tuples, lists or dictionaries. Return other objects as-is. - :param obj: + :param obj: the object :return: collection with ``None`` values removed """ if obj is None: diff --git a/src/drf_yasg/views.py b/src/drf_yasg/views.py index bd1499e..20f8db0 100644 --- a/src/drf_yasg/views.py +++ b/src/drf_yasg/views.py @@ -12,7 +12,8 @@ from rest_framework.views import APIView from .app_settings import swagger_settings from .renderers import ( - OpenAPIRenderer, ReDocOldRenderer, ReDocRenderer, SwaggerJSONRenderer, SwaggerUIRenderer, SwaggerYAMLRenderer + OpenAPIRenderer, ReDocOldRenderer, ReDocRenderer, SwaggerJSONRenderer, SwaggerUIRenderer, SwaggerYAMLRenderer, + _SpecRenderer ) SPEC_RENDERERS = (SwaggerYAMLRenderer, SwaggerJSONRenderer, OpenAPIRenderer) @@ -85,7 +86,12 @@ def get_schema_view(info=None, url=None, patterns=None, urlconf=None, public=Fal renderer_classes = _spec_renderers def get(self, request, version='', format=None): - generator = self.generator_class(info, request.version or version or '', url, patterns, urlconf) + version = request.version or version or '' + if isinstance(request.accepted_renderer, _SpecRenderer): + generator = self.generator_class(info, version, url, patterns, urlconf) + else: + generator = self.generator_class(info, version, url, patterns=[]) + schema = generator.get_schema(request, self.public) if schema is None: raise exceptions.PermissionDenied() # pragma: no cover