aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/routers.py
diff options
context:
space:
mode:
authorTom Christie2013-05-02 12:07:37 +0100
committerTom Christie2013-05-02 12:07:37 +0100
commit387250bee438a3826191b2d0d196d0c11373f7f3 (patch)
treeb6577882eb67740598bd4cf5c1824f85390d2a5b /rest_framework/routers.py
parente4067bfb75a38851ea865719ebfbb65708187b4e (diff)
downloaddjango-rest-framework-387250bee438a3826191b2d0d196d0c11373f7f3.tar.bz2
Automagically determine base_name in router class
Diffstat (limited to 'rest_framework/routers.py')
-rw-r--r--rest_framework/routers.py32
1 files changed, 30 insertions, 2 deletions
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
index 923405e8..0707635a 100644
--- a/rest_framework/routers.py
+++ b/rest_framework/routers.py
@@ -42,10 +42,22 @@ class BaseRouter(object):
def __init__(self):
self.registry = []
- def register(self, prefix, viewset, name):
- self.registry.append((prefix, viewset, name))
+ def register(self, prefix, viewset, base_name=None):
+ if base_name is None:
+ base_name = self.get_default_base_name(viewset)
+ self.registry.append((prefix, viewset, base_name))
+
+ def get_default_base_name(self, viewset):
+ """
+ If `base_name` is not specified, attempt to automatically determine
+ it from the viewset.
+ """
+ raise NotImplemented('get_default_base_name must be overridden')
def get_urls(self):
+ """
+ Return a list of URL patterns, given the registered viewsets.
+ """
raise NotImplemented('get_urls must be overridden')
@property
@@ -91,6 +103,22 @@ class SimpleRouter(BaseRouter):
),
]
+ def get_default_base_name(self, viewset):
+ """
+ If `base_name` is not specified, attempt to automatically determine
+ it from the viewset.
+ """
+ model_cls = getattr(viewset, 'model', None)
+ queryset = getattr(viewset, 'queryset', None)
+ if model_cls is None and queryset is not None:
+ model_cls = queryset.model
+
+ assert model_cls, '`name` not argument not specified, and could ' \
+ 'not automatically determine the name from the viewset, as ' \
+ 'it does not have a `.model` or `.queryset` attribute.'
+
+ return model_cls._meta.object_name.lower()
+
def get_routes(self, viewset):
"""
Augment `self.routes` with any dynamically generated routes.