diff options
| author | Alex Burgel | 2013-07-13 11:12:59 -0400 | 
|---|---|---|
| committer | Alex Burgel | 2013-07-15 17:59:37 -0400 | 
| commit | ca7ba07b4e42bd1c7c6bb8088c0c5a2c434b56ee (patch) | |
| tree | 9c30b1db53e60e65c50513ac9afa5318ca13de34 /rest_framework/routers.py | |
| parent | e14cbaf6961ad9c94deaf0417d8e8ce5ec96d0ac (diff) | |
| download | django-rest-framework-ca7ba07b4e42bd1c7c6bb8088c0c5a2c434b56ee.tar.bz2 | |
Introduce DynamicDetailRoute and DynamicListRoute to distinguish between different route types
Diffstat (limited to 'rest_framework/routers.py')
| -rw-r--r-- | rest_framework/routers.py | 26 | 
1 files changed, 8 insertions, 18 deletions
| diff --git a/rest_framework/routers.py b/rest_framework/routers.py index c8f711e9..b8f19b66 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -25,7 +25,9 @@ from rest_framework.reverse import reverse  from rest_framework.urlpatterns import format_suffix_patterns -Route = namedtuple('Route', ['key', 'url', 'mapping', 'name', 'initkwargs']) +Route = namedtuple('Route', ['url', 'mapping', 'name', 'initkwargs']) +DynamicDetailRoute = namedtuple('DynamicDetailRoute', ['url', 'name', 'initkwargs']) +DynamicListRoute = namedtuple('DynamicListRoute', ['url', 'name', 'initkwargs'])  def replace_methodname(format_string, methodname): @@ -80,7 +82,6 @@ class SimpleRouter(BaseRouter):      routes = [          # List route.          Route( -            key='list',              url=r'^{prefix}{trailing_slash}$',              mapping={                  'get': 'list', @@ -92,18 +93,13 @@ class SimpleRouter(BaseRouter):          # Dynamically generated list routes.          # Generated using @list_action or @list_link decorators          # on methods of the viewset. -        Route( -            key='collection', +        DynamicListRoute(              url=r'^{prefix}/{methodname}{trailing_slash}$', -            mapping={ -                '{httpmethod}': '{methodname}', -            },              name='{basename}-{methodnamehyphen}',              initkwargs={}          ),          # Detail route.          Route( -            key='detail',              url=r'^{prefix}/{lookup}{trailing_slash}$',              mapping={                  'get': 'retrieve', @@ -116,12 +112,8 @@ class SimpleRouter(BaseRouter):          ),          # Dynamically generated detail routes.          # Generated using @action or @link decorators on methods of the viewset. -        Route( -            key='dynamic', +        DynamicDetailRoute(              url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', -            mapping={ -                '{httpmethod}': '{methodname}', -            },              name='{basename}-{methodnamehyphen}',              initkwargs={}          ), @@ -154,7 +146,7 @@ class SimpleRouter(BaseRouter):          Returns a list of the Route namedtuple.          """ -        known_actions = flatten([route.mapping.values() for route in self.routes]) +        known_actions = flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)])          # Determine any `@action` or `@link` decorated methods on the viewset          detail_routes = [] @@ -176,25 +168,23 @@ class SimpleRouter(BaseRouter):          ret = []          for route in self.routes: -            if route.key == 'dynamic': +            if isinstance(route, DynamicDetailRoute):                  # Dynamic detail routes (@link or @action decorator)                  for httpmethods, methodname in detail_routes:                      initkwargs = route.initkwargs.copy()                      initkwargs.update(getattr(viewset, methodname).kwargs)                      ret.append(Route( -                        key=route.key,                          url=replace_methodname(route.url, methodname),                          mapping=dict((httpmethod, methodname) for httpmethod in httpmethods),                          name=replace_methodname(route.name, methodname),                          initkwargs=initkwargs,                      )) -            elif route.key == 'collection': +            elif isinstance(route, DynamicListRoute):                  # Dynamic list routes (@list_link or @list_action decorator)                  for httpmethods, methodname in list_routes:                      initkwargs = route.initkwargs.copy()                      initkwargs.update(getattr(viewset, methodname).kwargs)                      ret.append(Route( -                        key=route.key,                          url=replace_methodname(route.url, methodname),                          mapping=dict((httpmethod, methodname) for httpmethod in httpmethods),                          name=replace_methodname(route.name, methodname), | 
