Skip to content

Commit

Permalink
Merge pull request #42 from 5monkeys/fix/schema-view-versioning
Browse files Browse the repository at this point in the history
Fix schema view when another versioning scheme is used alongside bananas
  • Loading branch information
lundberg committed Oct 23, 2019
2 parents 45a1f48 + f842e1c commit 84ac2bf
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 46 deletions.
25 changes: 22 additions & 3 deletions bananas/admin/api/schemas/yasg.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,38 @@
from django.urls.exceptions import NoReverseMatch
from django.utils.translation import ugettext as _
from drf_yasg import openapi
from drf_yasg.generators import OpenAPISchemaGenerator
from drf_yasg.generators import EndpointEnumerator, OpenAPISchemaGenerator
from drf_yasg.inspectors.view import SwaggerAutoSchema
from drf_yasg.views import get_schema_view
from rest_framework import permissions, viewsets
from rest_framework.authentication import SessionAuthentication
from rest_framework.routers import SimpleRouter
from rest_framework.schemas.generators import is_custom_action
from rest_framework.versioning import URLPathVersioning

from ..versioning import BananasVersioning
from .base import BananasBaseRouter


class BananasEndpointEnumerator(EndpointEnumerator):
def should_include_endpoint(
self, path, callback, app_name="", namespace="", url_name=None
):
# Fall back to check namespace on the resolver match
request = self.request
if (
not namespace
and getattr(request, "version", None)
and getattr(request, "resolver_match", None)
):
namespace = request.resolver_match.namespace or ""
return super().should_include_endpoint(
path, callback, app_name, namespace, url_name
)


class BananasOpenAPISchemaGenerator(OpenAPISchemaGenerator):
endpoint_enumerator_class = BananasEndpointEnumerator

def get_schema(self, *args, **kwargs):
schema = super().get_schema(*args, **kwargs)
api_settings = getattr(settings, "ADMIN", {}).get("API", {})
Expand Down Expand Up @@ -120,5 +138,6 @@ def get_schema_view(self):
permission_classes=(permissions.AllowAny,),
patterns=self.urls,
)
view.versioning_class = URLPathVersioning
view.versioning_class = BananasVersioning

return view
14 changes: 14 additions & 0 deletions tests/separate_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.conf.urls import include, url
from rest_framework.routers import DefaultRouter
from rest_framework.viewsets import ViewSet


class SomeThingAPI(ViewSet):
def list(self, request):
pass


separate_router = DefaultRouter()
separate_router.register(r"some-thing", SomeThingAPI, "some-thing")

urlpatterns = [url("", include(separate_router.urls))]
75 changes: 38 additions & 37 deletions tests/settings.py
Original file line number Diff line number Diff line change
@@ -1,51 +1,52 @@
SECRET_KEY = 'bananas'
LANGUAGE_CODE = 'en'
SECRET_KEY = "bananas"
LANGUAGE_CODE = "en"

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
DATABASES = {"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}}

INSTALLED_APPS = [
'bananas',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'tests'
"bananas",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.admin",
"tests",
]

ROOT_URLCONF = 'tests.urls'
ROOT_URLCONF = "tests.urls"

MIDDLEWARE = MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATIC_URL = "/static/"
MEDIA_URL = "/media/"

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
]
},
},
}
]

REST_FRAMEWORK = {
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.AcceptHeaderVersioning",
"DEFAULT_VERSION": 1.0,
"ALLOWED_VERSIONS": [1.0],
}
6 changes: 4 additions & 2 deletions tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import django
from django.contrib.auth.models import AnonymousUser, Group, Permission, User
from django.core.management import call_command
from django.test import TestCase
from django.test import TestCase, override_settings

from bananas import admin, compat

Expand Down Expand Up @@ -224,7 +224,9 @@ def test_autorized_schema(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

data = response.json()
self.check_valid_schema(response.json())

def check_valid_schema(self, data):
self.assertNotIn("/bananas/login/", data["paths"])
self.assertIn("/bananas/logout/", data["paths"])
action = data["paths"]["/bananas/logout/"]["post"]
Expand Down
6 changes: 3 additions & 3 deletions tests/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ def test_show_urls(self):
admin_api_url_count = 13

if django.VERSION < (1, 9):
n_urls = 23 + admin_api_url_count
n_urls = 27 + admin_api_url_count
elif django.VERSION < (2, 0):
n_urls = 25 + admin_api_url_count
n_urls = 29 + admin_api_url_count
else:
n_urls = 27 + admin_api_url_count
n_urls = 31 + admin_api_url_count

self.assertEqual(len(urls), n_urls)

Expand Down
6 changes: 5 additions & 1 deletion tests/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
if django.VERSION >= (1, 10):
from bananas.admin import api
from .admin_api import FooAPI, HamAPI
from . import separate_api

api.register(FooAPI)
api.register(HamAPI)

urlpatterns += [url(r"^api/", include("bananas.admin.api.urls"))]
urlpatterns += [
url(r"^api/bananas", include("bananas.admin.api.urls")),
url(r"^api/separate", include(separate_api)),
]

0 comments on commit 84ac2bf

Please sign in to comment.