16
16
from __future__ import unicode_literals
17
17
18
18
import itertools
19
+ import warnings
19
20
from collections import OrderedDict , namedtuple
20
21
21
22
from django .conf .urls import url
30
31
from rest_framework .settings import api_settings
31
32
from rest_framework .urlpatterns import format_suffix_patterns
32
33
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 )
36
56
37
57
38
58
def escape_curly_brackets (url_path ):
@@ -103,14 +123,16 @@ class SimpleRouter(BaseRouter):
103
123
'post' : 'create'
104
124
},
105
125
name = '{basename}-list' ,
126
+ detail = False ,
106
127
initkwargs = {'suffix' : 'List' }
107
128
),
108
129
# Dynamically generated list routes.
109
130
# Generated using @list_route decorator
110
131
# on methods of the viewset.
111
- DynamicListRoute (
132
+ DynamicRoute (
112
133
url = r'^{prefix}/{methodname}{trailing_slash}$' ,
113
134
name = '{basename}-{methodnamehyphen}' ,
135
+ detail = False ,
114
136
initkwargs = {}
115
137
),
116
138
# Detail route.
@@ -123,13 +145,15 @@ class SimpleRouter(BaseRouter):
123
145
'delete' : 'destroy'
124
146
},
125
147
name = '{basename}-detail' ,
148
+ detail = True ,
126
149
initkwargs = {'suffix' : 'Instance' }
127
150
),
128
151
# Dynamically generated detail routes.
129
152
# Generated using @detail_route decorator on methods of the viewset.
130
- DynamicDetailRoute (
153
+ DynamicRoute (
131
154
url = r'^{prefix}/{lookup}/{methodname}{trailing_slash}$' ,
132
155
name = '{basename}-{methodnamehyphen}' ,
156
+ detail = True ,
133
157
initkwargs = {}
134
158
),
135
159
]
@@ -178,9 +202,9 @@ def get_routes(self, viewset):
178
202
179
203
routes = []
180
204
for route in self .routes :
181
- if isinstance (route , DynamicDetailRoute ) :
205
+ if isinstance (route , DynamicRoute ) and route . detail :
182
206
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 :
184
208
routes += [self ._get_dynamic_route (route , action ) for action in list_actions ]
185
209
else :
186
210
# Standard route
@@ -196,9 +220,10 @@ def _get_dynamic_route(self, route, action):
196
220
197
221
return Route (
198
222
url = replace_methodname (route .url , url_path ),
199
- name = replace_methodname (route .name , action .url_name ),
200
223
mapping = {http_method : action .__name__
201
224
for http_method in action .bind_to_methods },
225
+ name = replace_methodname (route .name , action .url_name ),
226
+ detail = route .detail ,
202
227
initkwargs = initkwargs ,
203
228
)
204
229
0 commit comments