diff options
| author | Tom Christie | 2013-05-02 12:07:37 +0100 |
|---|---|---|
| committer | Tom Christie | 2013-05-02 12:07:37 +0100 |
| commit | 387250bee438a3826191b2d0d196d0c11373f7f3 (patch) | |
| tree | b6577882eb67740598bd4cf5c1824f85390d2a5b /rest_framework/routers.py | |
| parent | e4067bfb75a38851ea865719ebfbb65708187b4e (diff) | |
| download | django-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.py | 32 |
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. |
