From aa8908fef2f5bfb52892923cb516bafdb3368ee5 Mon Sep 17 00:00:00 2001 From: Bart Vandendriessche Date: Tue, 11 Feb 2014 14:28:07 +0100 Subject: [PATCH] Allow DefaultRouter's api-root to be mounted on a url that includes captured parameters --- rest_framework/routers.py | 4 ++-- rest_framework/tests/test_routers.py | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 97b35c10a..2876dfa2a 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -254,10 +254,10 @@ class DefaultRouter(SimpleRouter): class APIRoot(views.APIView): _ignore_model_permissions = True - def get(self, request, format=None): + def get(self, request, format=None, *args, **kwargs): ret = {} for key, url_name in api_root_dict.items(): - ret[key] = reverse(url_name, request=request, format=format) + ret[key] = reverse(url_name, request=request, format=format, kwargs=kwargs) return Response(ret) return APIRoot.as_view() diff --git a/rest_framework/tests/test_routers.py b/rest_framework/tests/test_routers.py index e723f7d45..5eda19188 100644 --- a/rest_framework/tests/test_routers.py +++ b/rest_framework/tests/test_routers.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.db import models from django.test import TestCase from django.core.exceptions import ImproperlyConfigured -from rest_framework import serializers, viewsets, permissions +from rest_framework import serializers, viewsets, permissions, status from rest_framework.compat import include, patterns, url from rest_framework.decorators import link, action from rest_framework.response import Response @@ -164,6 +164,26 @@ class TestNameableRoot(TestCase): expected = 'nameable-root' self.assertEqual(expected, self.urls[0].name) +class TestScopedRoot(TestCase): + class NoteViewSet(viewsets.ModelViewSet): + model = RouterTestModel + + router = DefaultRouter() + router.register(r'notes', NoteViewSet) + + urls = patterns( + '', + url(r'^(?P\w[\w-]*)/', include(router.urls)), + ) + + def setUp(self): + self.view = self.router.get_api_root_view() + + def test_api_root_is_accessible(self): + request = factory.get('/scope/') # get the api-root + response = self.view(request, scope='scope') + self.assertEqual(response.status_code, status.HTTP_200_OK) + class TestActionKeywordArgs(TestCase): """