Role permissions API: Add permission checking and tests
Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
@@ -72,6 +72,9 @@ class RoleAPIViewSet(MayanAPIModelViewSet):
|
||||
'group_remove': permission_role_edit,
|
||||
'list': permission_role_view,
|
||||
'partial_update': permission_role_edit,
|
||||
'permission_add': permission_role_edit,
|
||||
'permission_list': permission_role_view,
|
||||
'permission_remove': permission_role_edit,
|
||||
'retrieve': permission_role_view,
|
||||
'update': permission_role_edit,
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ from django.contrib.auth.models import Group
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from mayan.apps.rest_api.mixins import ExternalObjectListSerializerMixin
|
||||
from mayan.apps.rest_api.relations import MultiKwargHyperlinkedIdentityField
|
||||
@@ -86,21 +87,43 @@ class RolePermissionAddRemoveSerializer(ExternalObjectListSerializerMixin, seria
|
||||
help_text=_(
|
||||
'Comma separated list of permission primary keys that will be added or '
|
||||
'removed.'
|
||||
), required=False, write_only=True
|
||||
), label=_('Permission ID list'), required=False, write_only=True
|
||||
)
|
||||
|
||||
class Meta:
|
||||
external_object_list_model = Permission
|
||||
external_object_list_pk_list_field = 'permission_id_list'
|
||||
external_object_list_pk_type = None
|
||||
|
||||
def filter_queryset(self, id_list, queryset):
|
||||
result = []
|
||||
for pk in id_list:
|
||||
try:
|
||||
result.append(Permission.get(pk=pk))
|
||||
except KeyError:
|
||||
raise ValidationError(
|
||||
{
|
||||
'permission_id_list': [
|
||||
'Permission "{}" not found.'.format(pk)
|
||||
]
|
||||
}, code='invalid'
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
def get_external_object_list_queryset(self):
|
||||
return Permission.all()
|
||||
|
||||
def permissions_add(self, instance):
|
||||
instance.permissions.add(
|
||||
*self.get_external_object_list()
|
||||
instance.permissions_add(
|
||||
queryset=self.get_external_object_list(),
|
||||
_user=self.context['request'].user
|
||||
)
|
||||
|
||||
def permissions_remove(self, instance):
|
||||
instance.permissions.remove(
|
||||
*self.get_external_object_list()
|
||||
instance.permissions_remove(
|
||||
queryset=self.get_external_object_list(),
|
||||
_user=self.context['request'].user
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -326,3 +326,95 @@ class RoleGroupAPITestCase(GroupTestMixin, RoleTestMixin, BaseAPITestCase):
|
||||
|
||||
self.test_role.refresh_from_db()
|
||||
self.assertTrue(self.test_group not in self.test_role.groups.all())
|
||||
|
||||
|
||||
class RolePermissionAPITestCase(PermissionTestMixin, RoleTestMixin, BaseAPITestCase):
|
||||
def _request_role_permission_list_api_view(self):
|
||||
return self.get(
|
||||
viewname='rest_api:role-permission-list',
|
||||
kwargs={'role_id': self.test_role.pk}
|
||||
)
|
||||
|
||||
def _request_role_permission_add_api_view(self):
|
||||
return self.post(
|
||||
viewname='rest_api:role-permission-add',
|
||||
kwargs={'role_id': self.test_role.pk},
|
||||
data={'permission_id_list': '{}'.format(self.test_permission.pk)}
|
||||
)
|
||||
|
||||
def _request_role_permission_remove_api_view(self):
|
||||
return self.post(
|
||||
viewname='rest_api:role-permission-remove',
|
||||
kwargs={'role_id': self.test_role.pk},
|
||||
data={'permission_id_list': '{}'.format(self.test_permission.pk)}
|
||||
)
|
||||
|
||||
def _setup_role_permission_list(self):
|
||||
self._create_test_permission()
|
||||
self._create_test_role()
|
||||
self.test_role.grant(permission=self.test_permission)
|
||||
|
||||
def test_role_permission_list_api_view_no_permission(self):
|
||||
self._setup_role_permission_list()
|
||||
|
||||
response = self._request_role_permission_list_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
||||
|
||||
def test_role_permission_list_api_view_with_access(self):
|
||||
self._setup_role_permission_list()
|
||||
|
||||
self.grant_access(obj=self.test_role, permission=permission_role_view)
|
||||
response = self._request_role_permission_list_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response.data['count'], 1)
|
||||
|
||||
def _setup_role_permission_add(self):
|
||||
self._create_test_permission()
|
||||
self._create_test_role()
|
||||
|
||||
def test_role_permission_add_api_view_no_permission(self):
|
||||
self._setup_role_permission_add()
|
||||
|
||||
response = self._request_role_permission_add_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
||||
|
||||
self.test_role.refresh_from_db()
|
||||
self.assertTrue(self.test_permission not in self.test_role.permissions.all())
|
||||
|
||||
def test_role_permission_add_api_view_with_access(self):
|
||||
self._setup_role_permission_add()
|
||||
|
||||
self.grant_access(obj=self.test_role, permission=permission_role_edit)
|
||||
response = self._request_role_permission_add_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
|
||||
self.test_role.refresh_from_db()
|
||||
self.assertTrue(
|
||||
self.test_permission.stored_permission in self.test_role.permissions.all()
|
||||
)
|
||||
|
||||
def _setup_role_permission_remove(self):
|
||||
self._create_test_permission()
|
||||
self._create_test_role()
|
||||
self.test_role.grant(permission=self.test_permission)
|
||||
|
||||
def test_role_permission_remove_api_view_no_permission(self):
|
||||
self._setup_role_permission_remove()
|
||||
|
||||
response = self._request_role_permission_remove_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
||||
|
||||
self.test_role.refresh_from_db()
|
||||
self.assertTrue(
|
||||
self.test_permission.stored_permission in self.test_role.permissions.all()
|
||||
)
|
||||
|
||||
def test_role_permission_remove_api_view_with_access(self):
|
||||
self._setup_role_permission_remove()
|
||||
|
||||
self.grant_access(obj=self.test_role, permission=permission_role_edit)
|
||||
response = self._request_role_permission_remove_api_view()
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
|
||||
self.test_role.refresh_from_db()
|
||||
self.assertTrue(self.test_permission not in self.test_role.permissions.all())
|
||||
|
||||
Reference in New Issue
Block a user