Skip to content

Commit aa28f4f

Browse files
committed
Implemented support for Django 2.0
1 parent 94571d0 commit aa28f4f

File tree

10 files changed

+54
-17
lines changed

10 files changed

+54
-17
lines changed

demo/project/accounts/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.conf.urls import url
22
from project.accounts import views
33

4+
app_name = "accounts"
45

56
urlpatterns = [
67
url(r'^test/$', views.TestView.as_view(), name="test-view"),

demo/project/organisations/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class Meta:
2929
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
3030
joined = models.DateTimeField(auto_now_add=True)
3131

32-
organisation = models.ForeignKey(Organisation)
33-
user = models.ForeignKey(User)
32+
organisation = models.ForeignKey(Organisation, on_delete=models.CASCADE)
33+
user = models.ForeignKey(User, on_delete=models.CASCADE)
3434
role = models.CharField(choices=MEMBER_ROLES, max_length=20, default="USER")
3535
is_owner = models.BooleanField(default=False)

demo/project/organisations/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.conf.urls import url
22
from project.organisations import views
33

4+
app_name = "organisations"
45

56
urlpatterns = [
67

demo/project/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from django.contrib import admin
1818

1919
urlpatterns = [
20-
url(r'^admin/', include(admin.site.urls)),
20+
url(r'^admin/', admin.site.urls),
2121
url(r'^docs/', include('rest_framework_docs.urls')),
2222

2323
# API

rest_framework_docs/api_docs.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
from importlib import import_module
22
from django.conf import settings
3-
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
3+
try:
4+
from django.urls import (
5+
URLPattern,
6+
URLResolver,
7+
)
8+
except ImportError:
9+
# Will be removed in Django 2.0
10+
from django.urls import (
11+
RegexURLPattern as URLPattern,
12+
RegexURLResolver as URLResolver,
13+
)
414
from django.utils.module_loading import import_string
515
from rest_framework.views import APIView
616
from rest_framework_docs.api_endpoint import ApiEndpoint
17+
from rest_framework.compat import get_regex_pattern
718

819

920
class ApiDocumentation(object):
@@ -23,10 +34,10 @@ def __init__(self, drf_router=None):
2334

2435
def get_all_view_names(self, urlpatterns, parent_regex=''):
2536
for pattern in urlpatterns:
26-
if isinstance(pattern, RegexURLResolver):
27-
regex = '' if pattern._regex == "^" else pattern._regex
37+
if isinstance(pattern, URLResolver):
38+
regex = '' if get_regex_pattern(pattern) == "^" else get_regex_pattern(pattern)
2839
self.get_all_view_names(urlpatterns=pattern.url_patterns, parent_regex=parent_regex + regex)
29-
elif isinstance(pattern, RegexURLPattern) and self._is_drf_view(pattern) and not self._is_format_endpoint(pattern):
40+
elif isinstance(pattern, URLPattern) and self._is_drf_view(pattern) and not self._is_format_endpoint(pattern):
3041
api_endpoint = ApiEndpoint(pattern, parent_regex, self.drf_router)
3142
self.endpoints.append(api_endpoint)
3243

@@ -40,7 +51,7 @@ def _is_format_endpoint(self, pattern):
4051
"""
4152
Exclude endpoints with a "format" parameter
4253
"""
43-
return '?P<format>' in pattern._regex
54+
return '?P<format>' in get_regex_pattern(pattern)
4455

4556
def get_endpoints(self):
4657
return self.endpoints

rest_framework_docs/api_endpoint.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from rest_framework.viewsets import ModelViewSet
88
from rest_framework.serializers import BaseSerializer
9+
from rest_framework.compat import get_regex_pattern
910

1011
VIEWSET_METHODS = {
1112
'List': ['get', 'post'],
@@ -35,9 +36,10 @@ def __init__(self, pattern, parent_regex=None, drf_router=None):
3536
self.permissions = self.__get_permissions_class__()
3637

3738
def __get_path__(self, parent_regex):
39+
regex = get_regex_pattern(self.pattern)
3840
if parent_regex:
39-
return "/{0}{1}".format(self.name_parent, simplify_regex(self.pattern.regex.pattern))
40-
return simplify_regex(self.pattern.regex.pattern)
41+
return "/{0}{1}".format(self.name_parent, simplify_regex(regex))
42+
return simplify_regex(regex)
4143

4244
def is_method_allowed(self, callback_cls, method_name):
4345
has_attr = hasattr(callback_cls, method_name)
@@ -69,7 +71,7 @@ def __get_allowed_methods__(self):
6971
lookup=lookup,
7072
trailing_slash=self.drf_router.trailing_slash
7173
)
72-
if self.pattern.regex.pattern == regex:
74+
if get_regex_pattern(self.pattern) == regex:
7375
funcs, viewset_methods = zip(
7476
*[(mapping[m], m.upper())
7577
for m in self.callback.cls.http_method_names

tests/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class Meta:
4343
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
4444
joined = models.DateTimeField(auto_now_add=True)
4545

46-
organisation = models.ForeignKey(Organisation)
47-
user = models.ForeignKey(User)
46+
organisation = models.ForeignKey(Organisation, on_delete=models.CASCADE)
47+
user = models.ForeignKey(User, on_delete=models.CASCADE)
4848
role = models.CharField(choices=MEMBER_ROLES, max_length=20, default="USER")
4949
is_owner = models.BooleanField(default=False)

tests/settings.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,20 @@
3939
# https://docs.djangoproject.com/en/1.8/howto/static-files/
4040

4141
STATIC_URL = '/static/'
42+
43+
44+
TEMPLATES = [
45+
{
46+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
47+
'DIRS': [],
48+
'APP_DIRS': True,
49+
'OPTIONS': {
50+
'context_processors': [
51+
'django.template.context_processors.debug',
52+
'django.template.context_processors.request',
53+
'django.contrib.auth.context_processors.auth',
54+
'django.contrib.messages.context_processors.messages',
55+
],
56+
},
57+
},
58+
]

tests/tests.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
from django.core.urlresolvers import reverse
1+
try:
2+
from django.urls import reverse
3+
except ImportError:
4+
# Will be removed in Django 2.0
5+
from django.core.urlresolvers import reverse
6+
27
from django.test import TestCase, override_settings
38
from rest_framework_docs.settings import DRFSettings
49

tests/urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
router.register('organisation-model-viewsets', views.TestModelViewSet, base_name='organisation')
3131

3232
urlpatterns = [
33-
url(r'^admin/', include(admin.site.urls)),
33+
url(r'^admin/', admin.site.urls),
3434
url(r'^docs/', DRFDocsView.as_view(drf_router=router), name='drfdocs'),
3535

3636
# API
37-
url(r'^accounts/', view=include(accounts_urls, namespace='accounts')),
38-
url(r'^organisations/', view=include(organisations_urls, namespace='organisations')),
37+
url(r'^accounts/', view=include((accounts_urls, "accounts"), namespace='accounts')),
38+
url(r'^organisations/', view=include((organisations_urls, "organisations"), namespace='organisations')),
3939
url(r'^', include(router.urls)),
4040

4141
# Endpoints without parents/namespaces

0 commit comments

Comments
 (0)