diff options
| author | Marek Skrajnowski | 2014-09-11 12:42:36 +0200 | 
|---|---|---|
| committer | Marek Skrajnowski | 2014-09-11 12:42:36 +0200 | 
| commit | ae8443853054635326598f6b06fb49429884d558 (patch) | |
| tree | a533cbaf9c1c1ef9e7bafd8b591f6802d69bf553 | |
| parent | 293728579070d802342bd92fa164e8dc0f0a7990 (diff) | |
| download | django-rest-framework-ae8443853054635326598f6b06fb49429884d558.tar.bz2 | |
Added DefaultRouter support (and test) for viewsets without the default action implemented, which is usually the list action.
| -rw-r--r-- | rest_framework/routers.py | 11 | ||||
| -rw-r--r-- | tests/test_routers.py | 18 | 
2 files changed, 27 insertions, 2 deletions
| diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 8f1ab6fa..01fd4b91 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -19,6 +19,7 @@ import itertools  from collections import namedtuple  from django.conf.urls import patterns, url  from django.core.exceptions import ImproperlyConfigured +from django.core.urlresolvers import NoReverseMatch  from rest_framework import views  from rest_framework.response import Response  from rest_framework.reverse import reverse @@ -287,7 +288,15 @@ class DefaultRouter(SimpleRouter):              def get(self, request, *args, **kwargs):                  ret = {}                  for key, url_name in api_root_dict.items(): -                    ret[key] = reverse(url_name, request=request, format=kwargs.get('format', None)) +                    try: +                        ret[key] = reverse( +                            url_name, +                            request=request, +                            format=kwargs.get('format', None) +                        ) +                    except NoReverseMatch: +                        continue +                  return Response(ret)          return APIRoot.as_view() diff --git a/tests/test_routers.py b/tests/test_routers.py index b076f134..f6f5a977 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, url, include  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, mixins, permissions  from rest_framework.decorators import detail_route, list_route  from rest_framework.response import Response  from rest_framework.routers import SimpleRouter, DefaultRouter @@ -284,3 +284,19 @@ class TestDynamicListAndDetailRouter(TestCase):              else:                  method_map = 'get'              self.assertEqual(route.mapping[method_map], endpoint) + + +class TestRootWithAListlessViewset(TestCase): +    def setUp(self): +        class NoteViewSet(mixins.RetrieveModelMixin, +                          viewsets.GenericViewSet): +            model = RouterTestModel + +        self.router = DefaultRouter() +        self.router.register(r'notes', NoteViewSet) +        self.view = self.router.urls[0].callback + +    def test_api_root(self): +        request = factory.get('/') +        response = self.view(request) +        self.assertEqual(response.data, {}) | 
