diff options
| author | Tom Christie | 2013-04-04 20:00:44 +0100 | 
|---|---|---|
| committer | Tom Christie | 2013-04-04 20:00:44 +0100 | 
| commit | c785628300d2b7cce63862a18915c537f8a3ab24 (patch) | |
| tree | 266aaf0f12ecb7228d50bffef671e8f611286f68 /rest_framework/routers.py | |
| parent | ec076a00786c6b89a55b6ffe2556bb3b777100f5 (diff) | |
| download | django-rest-framework-c785628300d2b7cce63862a18915c537f8a3ab24.tar.bz2 | |
Fleshing out viewsets/routers
Diffstat (limited to 'rest_framework/routers.py')
| -rw-r--r-- | rest_framework/routers.py | 43 | 
1 files changed, 43 insertions, 0 deletions
| diff --git a/rest_framework/routers.py b/rest_framework/routers.py new file mode 100644 index 00000000..63eae5d7 --- /dev/null +++ b/rest_framework/routers.py @@ -0,0 +1,43 @@ +from django.conf.urls import url, patterns + + +class BaseRouter(object): +    def __init__(self): +        self.registry = [] + +    def register(self, prefix, viewset, base_name): +        self.registry.append((prefix, viewset, base_name)) + +    def get_urlpatterns(self): +        raise NotImplemented('get_urlpatterns must be overridden') + +    @property +    def urlpatterns(self): +        if not hasattr(self, '_urlpatterns'): +            print self.get_urlpatterns() +            self._urlpatterns = patterns('', *self.get_urlpatterns()) +        return self._urlpatterns + + +class DefaultRouter(BaseRouter): +    route_list = [ +        (r'$', {'get': 'list', 'post': 'create'}, '%s-list'), +        (r'(?P<pk>[^/]+)/$', {'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}, '%s-detail'), +    ] + +    def get_urlpatterns(self): +        ret = [] +        for prefix, viewset, base_name in self.registry: +            for suffix, action_mapping, name_format in self.route_list: + +                # Only actions which actually exist on the viewset will be bound +                bound_actions = {} +                for method, action in action_mapping.items(): +                    if hasattr(viewset, action): +                        bound_actions[method] = action + +                regex = prefix + suffix +                view = viewset.as_view(bound_actions) +                name = name_format % base_name +                ret.append(url(regex, view, name=name)) +        return ret | 
