From beb1909fe78df5e7a556e81bf07987c054fed722 Mon Sep 17 00:00:00 2001
From: Victor Seva <vseva@sipwise.com>
Date: Thu, 20 Jan 2022 12:12:17 +0100
Subject: [PATCH] TT#121955 django-rest-swagger is deprecated

https: //www.django-rest-framework.org/topics/documenting-your-api/#drf-yasg-yet-another-swagger-generator

* We were getting error on /docs/
  > 'AutoSchema' object has no attribute 'get_link'

* provide /docs/ with swagger UI
  /redoc/ with ReDoc https://github.com/Redocly/redoc

Change-Id: I455e0c392285760d2450f7d3ec3d51209d20bf2a
---
 repoapi/settings/common.py | 21 +++++++++++++--------
 repoapi/urls.py            | 16 ++++++++++++++--
 repoapi/views.py           | 13 +------------
 requirements/common.txt    |  3 ++-
 t/Dockerfile               |  2 +-
 5 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/repoapi/settings/common.py b/repoapi/settings/common.py
index 5486232..948a227 100644
--- a/repoapi/settings/common.py
+++ b/repoapi/settings/common.py
@@ -30,7 +30,7 @@ INSTALLED_APPS = [
     "django.contrib.staticfiles",
     "rest_framework",
     "rest_framework_api_key",
-    "rest_framework_swagger",
+    "drf_spectacular",
     "django_assets",
     "django_celery_results",
     "django_extensions",
@@ -112,15 +112,20 @@ REST_FRAMEWORK = {
     "DEFAULT_FILTER_BACKENDS": (
         "django_filters.rest_framework.DjangoFilterBackend",
     ),
+    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
 }
 
-SWAGGER_SETTINGS = {
-    "api_version": "0.1",
-    "info": {
-        "contact": "dev@sipwise.com",
-        "description": "repoapi, one ring to rule them all",
-        "license": "GPL 3.0",
-        "title": "RepoApi",
+SPECTACULAR_SETTINGS = {
+    "TITLE": "RepoApi",
+    "DESCRIPTION": "repoapi, one ring to rule them all",
+    "VERSION": "1.0.0",
+    "CONTACT": {
+        "email": "development@sipwise.com",
+        "url": "https://www.sipwise.com/",
+    },
+    "LICENSE": {
+        "name": "GPLv3",
+        "url": "https://www.gnu.org/licenses/gpl-3.0.en.html",
     },
 }
 
diff --git a/repoapi/urls.py b/repoapi/urls.py
index 8a20080..6990beb 100644
--- a/repoapi/urls.py
+++ b/repoapi/urls.py
@@ -14,13 +14,17 @@
 # with this program.  If not, see <http://www.gnu.org/licenses/>.
 from django.contrib import admin
 from django.urls import include
+from django.urls import path
 from django.urls import re_path
+from drf_spectacular.views import SpectacularAPIView
+from drf_spectacular.views import SpectacularRedocView
+from drf_spectacular.views import SpectacularSwaggerView
 from rest_framework.urlpatterns import format_suffix_patterns
 
+from . import views
 from build import views as build_views
 from release_dashboard.views import api as rd_api
 from release_dashboard.views import docker
-from repoapi import views
 
 api_patterns = [
     re_path(r"^$", views.api_root, name="index"),
@@ -108,7 +112,15 @@ urlpatterns = [
         r"^api-auth/",
         include("rest_framework.urls", namespace="rest_framework"),
     ),
-    re_path(r"^docs/", views.schema_view),
+    path("api-schema/", SpectacularAPIView.as_view(), name="schema"),
+    path(
+        "docs/",
+        SpectacularSwaggerView.as_view(url_name="schema"),
+        name="swagger-ui",
+    ),
+    path(
+        "redoc/", SpectacularRedocView.as_view(url_name="schema"), name="redoc"
+    ),
     re_path(r"^panel/", include("panel.urls")),
     re_path(
         r"^release_panel/",
diff --git a/repoapi/views.py b/repoapi/views.py
index f5f7893..65233f3 100644
--- a/repoapi/views.py
+++ b/repoapi/views.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2020 The Sipwise Team - http://sipwise.com
+# Copyright (C) 2020-2022 The Sipwise Team - http://sipwise.com
 #
 # This program is free software: you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by the Free
@@ -16,25 +16,14 @@ import django_filters
 from rest_framework import generics
 from rest_framework import status
 from rest_framework.decorators import api_view
-from rest_framework.decorators import renderer_classes
 from rest_framework.response import Response
 from rest_framework.reverse import reverse
-from rest_framework.schemas import SchemaGenerator
 from rest_framework.views import APIView
-from rest_framework_swagger.renderers import OpenAPIRenderer
-from rest_framework_swagger.renderers import SwaggerUIRenderer
 
 from . import serializers
 from .models import JenkinsBuildInfo as jbi
 
 
-@api_view()
-@renderer_classes([OpenAPIRenderer, SwaggerUIRenderer])
-def schema_view(request):
-    generator = SchemaGenerator()
-    return Response(generator.get_schema(request=request))
-
-
 @api_view(("GET",))
 def api_root(request, _format=None):
     return Response(
diff --git a/requirements/common.txt b/requirements/common.txt
index 3b81950..84690b0 100644
--- a/requirements/common.txt
+++ b/requirements/common.txt
@@ -8,15 +8,16 @@ django-extensions
 django-filter
 django-import-export
 django-jsonify
-django-rest-swagger
 django-structlog
 django-timezone-field
 djangorestframework>=3.6
+drf-spectacular
 drfapikey
 flower>=0.9.5
 markdown
 natsort
 python-debian
 PyYAML
+requests
 six>=1.9
 webassets
diff --git a/t/Dockerfile b/t/Dockerfile
index 050f613..6269b1e 100644
--- a/t/Dockerfile
+++ b/t/Dockerfile
@@ -5,7 +5,7 @@ FROM docker.mgm.sipwise.com/sipwise-bullseye:latest
 # is updated with the current date. It will force refresh of all
 # of the base images and things like `apt-get update` won't be using
 # old cached versions when the Dockerfile is built.
-ENV REFRESHED_AT 2022-01-19
+ENV REFRESHED_AT 2022-01-20
 
 RUN apt-get update && apt-get install --assume-yes python3 python3-dev \
 	python3-pytest python3-pytest-pep8 \