From de950461c7f93010c3cde6c4b8dd61f55eeb7ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=20V=C3=AEjdea?= Date: Fri, 21 Dec 2018 12:40:31 +0200 Subject: [PATCH] Fix absolute urls for swagger-ui oauth settings --- src/drf_yasg/openapi.py | 1 - src/drf_yasg/renderers.py | 10 +++++++++- src/drf_yasg/static/drf-yasg/swagger-ui-init.js | 1 - testproj/testproj/settings/base.py | 8 ++++---- testproj/testproj/util.py | 10 ---------- testproj/users/migrations/0002_setup_oauth2_apps.py | 5 +---- tests/reference.yaml | 2 +- 7 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/drf_yasg/openapi.py b/src/drf_yasg/openapi.py index 46889d2..95e6021 100644 --- a/src/drf_yasg/openapi.py +++ b/src/drf_yasg/openapi.py @@ -3,7 +3,6 @@ import six import collections import logging import re -import sys from collections import OrderedDict from coreapi.compat import urlparse diff --git a/src/drf_yasg/renderers.py b/src/drf_yasg/renderers.py index a265688..a1a7b61 100644 --- a/src/drf_yasg/renderers.py +++ b/src/drf_yasg/renderers.py @@ -2,6 +2,7 @@ import six from django.shortcuts import resolve_url from django.template.loader import render_to_string +from django.utils.encoding import force_text from django.utils.functional import Promise from rest_framework.renderers import BaseRenderer, JSONRenderer, TemplateHTMLRenderer from rest_framework.utils import encoders, json @@ -120,7 +121,14 @@ class SwaggerUIRenderer(_UIRenderer): 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(), cls=encoders.JSONEncoder) + swagger_ui_settings = self.get_swagger_ui_settings() + + request = renderer_context['request'] + oauth_redirect_url = force_text(swagger_ui_settings.get('oauth2RedirectUrl', '')) + if request and oauth_redirect_url: + swagger_ui_settings['oauth2RedirectUrl'] = request.build_absolute_uri(oauth_redirect_url) + + renderer_context['swagger_settings'] = json.dumps(swagger_ui_settings, cls=encoders.JSONEncoder) def get_swagger_ui_settings(self): data = { diff --git a/src/drf_yasg/static/drf-yasg/swagger-ui-init.js b/src/drf_yasg/static/drf-yasg/swagger-ui-init.js index cb8e67b..a9f6925 100644 --- a/src/drf_yasg/static/drf-yasg/swagger-ui-init.js +++ b/src/drf_yasg/static/drf-yasg/swagger-ui-init.js @@ -192,7 +192,6 @@ function initSwaggerUiConfig(swaggerSettings, oauth2Settings) { var oldResponseInterceptor = swaggerUiConfig.responseInterceptor; swaggerUiConfig.responseInterceptor = function (response) { var absUrl = new URL(response.url, currentPath); - console.log("response", response); if (absUrl.href in specRequestsInFlight) { var setToUrl = specRequestsInFlight[absUrl.href]; delete specRequestsInFlight[absUrl.href]; diff --git a/testproj/testproj/settings/base.py b/testproj/testproj/settings/base.py index ad08c1a..b387a17 100644 --- a/testproj/testproj/settings/base.py +++ b/testproj/testproj/settings/base.py @@ -3,7 +3,7 @@ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) from django.urls import reverse_lazy -from testproj.util import full_url_lazy, static_lazy +from testproj.util import static_lazy BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -100,9 +100,9 @@ OAUTH2_CLIENT_SECRET = '5FvYALo7W4uNnWE2ySw7Yzpkxh9PSf5GuY37RvOys00ydEyph64dbl1E 'AKoz0JpiVQtq0DUnsxNhU3ubrJgZ9YbtiXymbLGJq8L7n4fiER7gXbXaNSbze3BN' OAUTH2_APP_NAME = 'drf-yasg OAuth2 provider' -OAUTH2_REDIRECT_URL = full_url_lazy(static_lazy('drf-yasg/swagger-ui-dist/oauth2-redirect.html')) -OAUTH2_AUTHORIZE_URL = full_url_lazy(reverse_lazy('oauth2_provider:authorize')) -OAUTH2_TOKEN_URL = full_url_lazy(reverse_lazy('oauth2_provider:token')) +OAUTH2_REDIRECT_URL = static_lazy('drf-yasg/swagger-ui-dist/oauth2-redirect.html') +OAUTH2_AUTHORIZE_URL = reverse_lazy('oauth2_provider:authorize') +OAUTH2_TOKEN_URL = reverse_lazy('oauth2_provider:token') # drf-yasg SWAGGER_SETTINGS = { diff --git a/testproj/testproj/util.py b/testproj/testproj/util.py index 8a9c3a3..6a7f127 100644 --- a/testproj/testproj/util.py +++ b/testproj/testproj/util.py @@ -4,14 +4,4 @@ from django.utils.encoding import force_text from django.utils.functional import lazy -def full_url(absolute_path): - try: - return "http://test.local:8002" + force_text(absolute_path) - except NoReverseMatch: - # if absolute_path is a resolve_lazy, it might point to an invalid name - # just ignore it if it does - return "http://test.local:8002/no-reverse-match/" - - -full_url_lazy = lazy(full_url, str) static_lazy = lazy(static, str) diff --git a/testproj/users/migrations/0002_setup_oauth2_apps.py b/testproj/users/migrations/0002_setup_oauth2_apps.py index c684748..4fa5fe6 100644 --- a/testproj/users/migrations/0002_setup_oauth2_apps.py +++ b/testproj/users/migrations/0002_setup_oauth2_apps.py @@ -1,9 +1,6 @@ # Generated by Django 2.1.3 on 2018-12-19 07:57 from django.conf import settings -from django.contrib.staticfiles.templatetags.staticfiles import static -from django.db import migrations, IntegrityError - -from testproj.util import full_url_lazy +from django.db import migrations def add_oauth_apps(apps, schema_editor): diff --git a/tests/reference.yaml b/tests/reference.yaml index 7895e13..95800b8 100644 --- a/tests/reference.yaml +++ b/tests/reference.yaml @@ -32,7 +32,7 @@ securityDefinitions: scopes: read: Read everything. write: Write everything, - tokenUrl: http://test.local:8002/o/token/ + tokenUrl: /o/token/ type: oauth2 Query: in: query