Skip to content

Commit b085754

Browse files
committed
Respect can_read_model in DjangoModelPermissions
Django version 2.1 introduced the `can_read_model` permission to support read-only ModelAdmin views. Add support for this permission to a DjangoModelPermissions subclass. (A subclass is created in order to preserve backwards-compatibility with versions of Django that don't support this flag).
1 parent 2084555 commit b085754

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

rest_framework/permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class DjangoModelPermissions(BasePermission):
151151
# Override this if you need to also provide 'view' permissions,
152152
# or if you want to provide custom permission codes.
153153
perms_map = {
154-
'GET': [],
154+
'GET': ['%(app_label)s.view_%(model_name)s'],
155155
'OPTIONS': [],
156156
'HEAD': [],
157157
'POST': ['%(app_label)s.add_%(model_name)s'],

tests/test_permissions.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def setUp(self):
7979
user.user_permissions.set([
8080
Permission.objects.get(codename='add_basicmodel'),
8181
Permission.objects.get(codename='change_basicmodel'),
82-
Permission.objects.get(codename='delete_basicmodel')
82+
Permission.objects.get(codename='delete_basicmodel'),
83+
Permission.objects.get(codename='view_basicmodel'),
8384
])
8485

8586
user = User.objects.create_user('updateonly', '[email protected]', 'password')
@@ -117,6 +118,12 @@ def test_get_queryset_has_create_permissions(self):
117118
response = get_queryset_list_view(request, pk=1)
118119
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
119120

121+
def test_has_read_permissions(self):
122+
request = factory.get('/', {'text': 'foobar'}, format='json',
123+
HTTP_AUTHORIZATION=self.permitted_credentials)
124+
response = root_view(request, pk=1)
125+
self.assertEqual(response.status_code, status.HTTP_200_OK)
126+
120127
def test_has_put_permissions(self):
121128
request = factory.put('/1', {'text': 'foobar'}, format='json',
122129
HTTP_AUTHORIZATION=self.permitted_credentials)
@@ -134,6 +141,12 @@ def test_does_not_have_create_permissions(self):
134141
response = root_view(request, pk=1)
135142
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
136143

144+
def test_does_not_have_read_permissions(self):
145+
request = factory.get('/', {'text': 'foobar'}, format='json',
146+
HTTP_AUTHORIZATION=self.disallowed_credentials)
147+
response = root_view(request, pk=1)
148+
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
149+
137150
def test_does_not_have_put_permissions(self):
138151
request = factory.put('/1', {'text': 'foobar'}, format='json',
139152
HTTP_AUTHORIZATION=self.disallowed_credentials)

0 commit comments

Comments
 (0)