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. | 
