mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 14:24:48 +03:00
Allow DjangoObjectPermissions to use views that define get_queryset
This commit is contained in:
parent
2b6726e703
commit
882f03789c
|
@ -172,7 +172,7 @@ class DjangoObjectPermissions(DjangoModelPermissions):
|
||||||
return [perm % kwargs for perm in self.perms_map[method]]
|
return [perm % kwargs for perm in self.perms_map[method]]
|
||||||
|
|
||||||
def has_object_permission(self, request, view, obj):
|
def has_object_permission(self, request, view, obj):
|
||||||
model_cls = view.queryset.model
|
model_cls = view.get_queryset().model
|
||||||
user = request.user
|
user = request.user
|
||||||
|
|
||||||
perms = self.get_required_object_permissions(request.method, model_cls)
|
perms = self.get_required_object_permissions(request.method, model_cls)
|
||||||
|
|
|
@ -227,6 +227,18 @@ class ObjectPermissionListView(generics.ListAPIView):
|
||||||
object_permissions_list_view = ObjectPermissionListView.as_view()
|
object_permissions_list_view = ObjectPermissionListView.as_view()
|
||||||
|
|
||||||
|
|
||||||
|
class GetQuerysetObjectPermissionInstanceView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
serializer_class = BasicPermSerializer
|
||||||
|
authentication_classes = [authentication.BasicAuthentication]
|
||||||
|
permission_classes = [ViewObjectPermissions]
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return BasicPermModel.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
get_queryset_object_permissions_view = GetQuerysetObjectPermissionInstanceView.as_view()
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(guardian, 'django-guardian not installed')
|
@unittest.skipUnless(guardian, 'django-guardian not installed')
|
||||||
class ObjectPermissionsIntegrationTests(TestCase):
|
class ObjectPermissionsIntegrationTests(TestCase):
|
||||||
"""
|
"""
|
||||||
|
@ -326,6 +338,15 @@ class ObjectPermissionsIntegrationTests(TestCase):
|
||||||
response = object_permissions_view(request, pk='1')
|
response = object_permissions_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
def test_can_read_get_queryset_permissions(self):
|
||||||
|
"""
|
||||||
|
same as ``test_can_read_permissions`` but with a view
|
||||||
|
that rely on ``.get_queryset()`` instead of ``.queryset``.
|
||||||
|
"""
|
||||||
|
request = factory.get('/1', HTTP_AUTHORIZATION=self.credentials['readonly'])
|
||||||
|
response = get_queryset_object_permissions_view(request, pk='1')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
# Read list
|
# Read list
|
||||||
def test_can_read_list_permissions(self):
|
def test_can_read_list_permissions(self):
|
||||||
request = factory.get('/', HTTP_AUTHORIZATION=self.credentials['readonly'])
|
request = factory.get('/', HTTP_AUTHORIZATION=self.credentials['readonly'])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user