From 6f66798ad3242c742ab0c5edcc038a9c7b469c2e Mon Sep 17 00:00:00 2001 From: Nicolas Delaby Date: Wed, 22 Apr 2015 10:15:34 +0200 Subject: [PATCH 1/2] Prevent empty `queryset`s to raises AssertionError. --- rest_framework/permissions.py | 2 +- tests/test_permissions.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 22ca2f8128..de4ebedb60 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -120,7 +120,7 @@ def has_permission(self, request, view): if queryset is None and getattr(view, '_ignore_model_permissions', False): return True - assert queryset, ( + assert queryset is not None, ( 'Cannot apply DjangoModelPermissions on a view that ' 'does not have `.queryset` property.' ) diff --git a/tests/test_permissions.py b/tests/test_permissions.py index 223100a785..9225308c7f 100644 --- a/tests/test_permissions.py +++ b/tests/test_permissions.py @@ -41,9 +41,17 @@ def get_queryset(self): return BasicModel.objects.all() +class EmptyListView(generics.ListCreateAPIView): + queryset = BasicModel.objects.none() + serializer_class = BasicSerializer + authentication_classes = [authentication.BasicAuthentication] + permission_classes = [permissions.DjangoModelPermissions] + + root_view = RootView.as_view() instance_view = InstanceView.as_view() get_queryset_list_view = GetQuerySetListView.as_view() +empty_list_view = EmptyListView.as_view() def basic_auth_header(username, password): @@ -166,6 +174,11 @@ def test_options_updateonly(self): self.assertIn('actions', response.data) self.assertEqual(list(response.data['actions'].keys()), ['PUT']) + def test_empty_view_does_not_assert(self): + request = factory.get('/1', HTTP_AUTHORIZATION=self.permitted_credentials) + response = empty_list_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_200_OK) + class BasicPermModel(models.Model): text = models.CharField(max_length=100) From 24e94730368c96ffe809370dad8ae5140136279d Mon Sep 17 00:00:00 2001 From: Nicolas Delaby Date: Wed, 22 Apr 2015 11:22:37 +0200 Subject: [PATCH 2/2] Improve error message. --- rest_framework/permissions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index de4ebedb60..8fa7e44523 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -122,7 +122,7 @@ def has_permission(self, request, view): assert queryset is not None, ( 'Cannot apply DjangoModelPermissions on a view that ' - 'does not have `.queryset` property.' + 'does not have `.queryset` property nor redefines `.get_queryset()`.' ) perms = self.get_required_permissions(request.method, queryset.model)