diff options
| author | Philip Douglas | 2013-07-04 05:29:42 -0700 |
|---|---|---|
| committer | Philip Douglas | 2013-07-04 05:29:42 -0700 |
| commit | bf8e71c455a47a53898f8239ac7dad47e5f1d53a (patch) | |
| tree | 967055f41f43a35b8d9362f47c81aad5af4036d3 /rest_framework/routers.py | |
| parent | fa9f5fb8dcf6d51b2db70d4e2a991779b056d1d4 (diff) | |
| parent | 5fa100245cbf71a47c7a1ea7a869d03049380130 (diff) | |
| download | django-rest-framework-bf8e71c455a47a53898f8239ac7dad47e5f1d53a.tar.bz2 | |
Merge pull request #1 from tomchristie/master
Update from main
Diffstat (limited to 'rest_framework/routers.py')
| -rw-r--r-- | rest_framework/routers.py | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/rest_framework/routers.py b/rest_framework/routers.py index ae64cc3b..930011d3 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -15,7 +15,9 @@ For example, you might have a `urls.py` that looks something like this: """ from __future__ import unicode_literals +import itertools from collections import namedtuple +from django.core.exceptions import ImproperlyConfigured from rest_framework import views from rest_framework.compat import patterns, url from rest_framework.response import Response @@ -38,6 +40,13 @@ def replace_methodname(format_string, methodname): return ret +def flatten(list_of_lists): + """ + Takes an iterable of iterables, returns a single iterable containing all items + """ + return itertools.chain(*list_of_lists) + + class BaseRouter(object): def __init__(self): self.registry = [] @@ -117,7 +126,7 @@ class SimpleRouter(BaseRouter): if model_cls is None and queryset is not None: model_cls = queryset.model - assert model_cls, '`name` not argument not specified, and could ' \ + assert model_cls, '`base_name` argument not specified, and could ' \ 'not automatically determine the name from the viewset, as ' \ 'it does not have a `.model` or `.queryset` attribute.' @@ -130,12 +139,17 @@ class SimpleRouter(BaseRouter): Returns a list of the Route namedtuple. """ + known_actions = flatten([route.mapping.values() for route in self.routes]) + # Determine any `@action` or `@link` decorated methods on the viewset dynamic_routes = [] for methodname in dir(viewset): attr = getattr(viewset, methodname) httpmethods = getattr(attr, 'bind_to_methods', None) if httpmethods: + if methodname in known_actions: + raise ImproperlyConfigured('Cannot use @action or @link decorator on ' + 'method "%s" as it is an existing route' % methodname) httpmethods = [method.lower() for method in httpmethods] dynamic_routes.append((httpmethods, methodname)) |
