aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/routers.py
diff options
context:
space:
mode:
authorTom Christie2013-04-04 20:00:44 +0100
committerTom Christie2013-04-04 20:00:44 +0100
commitc785628300d2b7cce63862a18915c537f8a3ab24 (patch)
tree266aaf0f12ecb7228d50bffef671e8f611286f68 /rest_framework/routers.py
parentec076a00786c6b89a55b6ffe2556bb3b777100f5 (diff)
downloaddjango-rest-framework-c785628300d2b7cce63862a18915c537f8a3ab24.tar.bz2
Fleshing out viewsets/routers
Diffstat (limited to 'rest_framework/routers.py')
-rw-r--r--rest_framework/routers.py43
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