This commit is contained in:
Alan Justino da Silva 2013-08-21 12:20:01 -07:00
commit 931ce1b8f1

View File

@ -184,14 +184,17 @@ class SimpleRouter(BaseRouter):
bound_methods[method] = action
return bound_methods
def get_lookup_regex(self, viewset):
def get_lookup_regex(self, viewset, lookup_prefix=''):
"""
Given a viewset, return the portion of URL regex that is used
to match against a single instance.
"""
base_regex = '(?P<{lookup_field}>[^/]+)'
if lookup_prefix:
lookup_prefix += '_'
base_regex = '(?P<{lookup_prefix}{lookup_field}>[^/]+)'
lookup_field = getattr(viewset, 'lookup_field', 'pk')
return base_regex.format(lookup_field=lookup_field)
return base_regex.format(lookup_field=lookup_field, lookup_prefix=lookup_prefix)
def get_urls(self):
"""
@ -270,3 +273,30 @@ class DefaultRouter(SimpleRouter):
urls = format_suffix_patterns(urls)
return urls
class NestedSimpleRouter(SimpleRouter):
def __init__(self, parent_router, parent_prefix, *args, **kwargs):
self.parent_router = parent_router
self.parent_prefix = parent_prefix
self.nest_count = getattr(parent_router, 'nest_count', 0) +1
super(NestedSimpleRouter, self).__init__(*args, **kwargs)
parent_registry = filter(lambda registered: registered[0] == self.parent_prefix, self.parent_router.registry)
try:
parent_registry = parent_registry[0]
parent_prefix, parent_viewset, parent_basename = parent_registry
except:
raise RuntimeError('parent registered resource not found')
nested_routes = []
nest_prefix = 'nested_%i' % self.nest_count
parent_lookup_regex = parent_router.get_lookup_regex(parent_viewset, nest_prefix)
for route in self.routes:
route_contents = route.__dict__
parent_regex = '{parent_prefix}/{parent_lookup_regex}/'.format(parent_prefix=parent_prefix, parent_lookup_regex=parent_lookup_regex)
route_contents['url'] = route.url.replace('^', '^'+parent_regex)
nested_routes.append(Route(**route_contents))
self.routes = nested_routes