aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarlon Bailey2013-05-11 22:26:34 -0400
committerMarlon Bailey2013-05-11 22:26:34 -0400
commit9d2580dccfe23e113221c7e150bddebb95d98214 (patch)
tree4d07b3aa372d8cfabb919b35ff41e003f30a26e2
parentfd4a66cfc7888775d20b18665d63156cf3dae13a (diff)
downloaddjango-rest-framework-9d2580dccfe23e113221c7e150bddebb95d98214.tar.bz2
added support for multiple @action and @link decorators on a viewset, along with a router testcase illustrating the failure against the master code base
-rw-r--r--rest_framework/routers.py6
-rw-r--r--rest_framework/tests/routers.py46
2 files changed, 49 insertions, 3 deletions
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
index 0707635a..ebdf2b2a 100644
--- a/rest_framework/routers.py
+++ b/rest_framework/routers.py
@@ -127,18 +127,18 @@ class SimpleRouter(BaseRouter):
"""
# Determine any `@action` or `@link` decorated methods on the viewset
- dynamic_routes = {}
+ dynamic_routes = []
for methodname in dir(viewset):
attr = getattr(viewset, methodname)
httpmethod = getattr(attr, 'bind_to_method', None)
if httpmethod:
- dynamic_routes[httpmethod] = methodname
+ dynamic_routes.append((httpmethod, methodname))
ret = []
for route in self.routes:
if route.mapping == {'{httpmethod}': '{methodname}'}:
# Dynamic routes (@link or @action decorator)
- for httpmethod, methodname in dynamic_routes.items():
+ for httpmethod, methodname in dynamic_routes:
initkwargs = route.initkwargs.copy()
initkwargs.update(getattr(viewset, methodname).kwargs)
ret.append(Route(
diff --git a/rest_framework/tests/routers.py b/rest_framework/tests/routers.py
new file mode 100644
index 00000000..138d13d7
--- /dev/null
+++ b/rest_framework/tests/routers.py
@@ -0,0 +1,46 @@
+from __future__ import unicode_literals
+from django.test import TestCase
+from django.test.client import RequestFactory
+from rest_framework import status
+from rest_framework.response import Response
+from rest_framework import viewsets
+from rest_framework.decorators import link, action
+from rest_framework.routers import SimpleRouter
+import copy
+
+factory = RequestFactory()
+
+
+class BasicViewSet(viewsets.ViewSet):
+ def list(self, request, *args, **kwargs):
+ return Response({'method': 'list'})
+
+ @action()
+ def action1(self, request, *args, **kwargs):
+ return Response({'method': 'action1'})
+
+ @action()
+ def action2(self, request, *args, **kwargs):
+ return Response({'method': 'action2'})
+
+ @link()
+ def link1(self, request, *args, **kwargs):
+ return Response({'method': 'link1'})
+
+ @link()
+ def link2(self, request, *args, **kwargs):
+ return Response({'method': 'link2'})
+
+
+class TestSimpleRouter(TestCase):
+ def setUp(self):
+ self.router = SimpleRouter()
+
+ def test_link_and_action_decorator(self):
+ routes = self.router.get_routes(BasicViewSet)
+ # Should be 2 by default, and then four from the @action and @link combined
+ #self.assertEqual(len(routes), 6)
+ #
+ decorator_routes = routes[2:]
+ for i, method in enumerate(['action1', 'action2', 'link1', 'link2']):
+ self.assertEqual(decorator_routes[i].mapping.values()[0], method)