Skip to content

Commit 8a054f5

Browse files
author
Ryan P Kilby
committed
Deprecate Dynamic{Detail,List}Route w DynamicRoute
1 parent 7bac555 commit 8a054f5

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

rest_framework/routers.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from __future__ import unicode_literals
1717

1818
import itertools
19+
import warnings
1920
from collections import OrderedDict, namedtuple
2021

2122
from django.conf.urls import url
@@ -30,9 +31,28 @@
3031
from rest_framework.settings import api_settings
3132
from rest_framework.urlpatterns import format_suffix_patterns
3233

33-
Route = namedtuple('Route', ['url', 'mapping', 'name', 'initkwargs'])
34-
DynamicDetailRoute = namedtuple('DynamicDetailRoute', ['url', 'name', 'initkwargs'])
35-
DynamicListRoute = namedtuple('DynamicListRoute', ['url', 'name', 'initkwargs'])
34+
Route = namedtuple('Route', ['url', 'mapping', 'name', 'detail', 'initkwargs'])
35+
DynamicRoute = namedtuple('DynamicRoute', ['url', 'name', 'detail', 'initkwargs'])
36+
37+
38+
class DynamicDetailRoute(object):
39+
def __new__(cls, url, name, initkwargs):
40+
warnings.warn(
41+
"`DynamicDetailRoute` has been deprecated in favor of `DynamicRoute`, which accepts a "
42+
"`detail` boolean. Use `DynamicRoute(url, name, True, initkwargs)` instead.",
43+
PendingDeprecationWarning
44+
)
45+
return DynamicRoute(url, name, detail=True, initkwargs=initkwargs)
46+
47+
48+
class DynamicListRoute(object):
49+
def __new__(cls, url, name, initkwargs):
50+
warnings.warn(
51+
"`DynamicListRoute` has been deprecated in favor of `DynamicRoute`, which accepts a "
52+
"`detail` boolean. Use `DynamicRoute(url, name, False, initkwargs)` instead.",
53+
PendingDeprecationWarning
54+
)
55+
return DynamicRoute(url, name, False, initkwargs)
3656

3757

3858
def escape_curly_brackets(url_path):
@@ -103,14 +123,16 @@ class SimpleRouter(BaseRouter):
103123
'post': 'create'
104124
},
105125
name='{basename}-list',
126+
detail=False,
106127
initkwargs={'suffix': 'List'}
107128
),
108129
# Dynamically generated list routes.
109130
# Generated using @list_route decorator
110131
# on methods of the viewset.
111-
DynamicListRoute(
132+
DynamicRoute(
112133
url=r'^{prefix}/{methodname}{trailing_slash}$',
113134
name='{basename}-{methodnamehyphen}',
135+
detail=False,
114136
initkwargs={}
115137
),
116138
# Detail route.
@@ -123,13 +145,15 @@ class SimpleRouter(BaseRouter):
123145
'delete': 'destroy'
124146
},
125147
name='{basename}-detail',
148+
detail=True,
126149
initkwargs={'suffix': 'Instance'}
127150
),
128151
# Dynamically generated detail routes.
129152
# Generated using @detail_route decorator on methods of the viewset.
130-
DynamicDetailRoute(
153+
DynamicRoute(
131154
url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$',
132155
name='{basename}-{methodnamehyphen}',
156+
detail=True,
133157
initkwargs={}
134158
),
135159
]
@@ -178,9 +202,9 @@ def get_routes(self, viewset):
178202

179203
routes = []
180204
for route in self.routes:
181-
if isinstance(route, DynamicDetailRoute):
205+
if isinstance(route, DynamicRoute) and route.detail:
182206
routes += [self._get_dynamic_route(route, action) for action in detail_actions]
183-
elif isinstance(route, DynamicListRoute):
207+
elif isinstance(route, DynamicRoute) and not route.detail:
184208
routes += [self._get_dynamic_route(route, action) for action in list_actions]
185209
else:
186210
# Standard route
@@ -196,9 +220,10 @@ def _get_dynamic_route(self, route, action):
196220

197221
return Route(
198222
url=replace_methodname(route.url, url_path),
199-
name=replace_methodname(route.name, action.url_name),
200223
mapping={http_method: action.__name__
201224
for http_method in action.bind_to_methods},
225+
name=replace_methodname(route.name, action.url_name),
226+
detail=route.detail,
202227
initkwargs=initkwargs,
203228
)
204229

0 commit comments

Comments
 (0)