Add role create and edit events
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -149,6 +149,7 @@
|
||||
* Update ChoiceForm to be full height.
|
||||
* Add AddRemoveView to replace AssignRemoveView
|
||||
* Update the group roles view to use the new AddRemoveView.
|
||||
* Add role create and edit events.
|
||||
|
||||
3.1.11 (2019-04-XX)
|
||||
===================
|
||||
|
||||
@@ -181,6 +181,7 @@ Other changes
|
||||
* Update ChoiceForm to be full height.
|
||||
* Add AddRemoveView to replace AssignRemoveView
|
||||
* Update the group roles view to use the new AddRemoveView.
|
||||
* Add role create and edit events.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
@@ -12,7 +12,9 @@ from mayan.apps.common.menus import (
|
||||
menu_list_facet, menu_object, menu_secondary, menu_setup
|
||||
)
|
||||
from mayan.apps.common.signals import perform_upgrade
|
||||
from mayan.apps.events import ModelEventType
|
||||
|
||||
from .events import event_role_created, event_role_edited
|
||||
from .handlers import purge_permissions
|
||||
from .links import (
|
||||
link_group_roles, link_role_create, link_role_delete, link_role_edit,
|
||||
@@ -35,6 +37,7 @@ class PermissionsApp(MayanAppConfig):
|
||||
|
||||
def ready(self):
|
||||
super(PermissionsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
Role = self.get_model('Role')
|
||||
Group = apps.get_model(app_label='auth', model_name='Group')
|
||||
@@ -42,6 +45,10 @@ class PermissionsApp(MayanAppConfig):
|
||||
Group.add_to_class(name='roles_add', value=method_group_roles_add)
|
||||
Group.add_to_class(name='roles_remove', value=method_group_roles_remove)
|
||||
|
||||
ModelEventType.register(
|
||||
event_types=(event_role_created, event_role_edited), model=Role
|
||||
)
|
||||
|
||||
ModelPermission.register(
|
||||
model=Role, permissions=(
|
||||
permission_acl_edit, permission_acl_view,
|
||||
@@ -72,3 +79,5 @@ class PermissionsApp(MayanAppConfig):
|
||||
perform_upgrade.connect(
|
||||
purge_permissions, dispatch_uid='purge_permissions'
|
||||
)
|
||||
|
||||
registry.register(Role)
|
||||
|
||||
16
mayan/apps/permissions/events.py
Normal file
16
mayan/apps/permissions/events.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.events import EventTypeNamespace
|
||||
|
||||
namespace = EventTypeNamespace(
|
||||
label=_('Permissions'), name='permissions'
|
||||
)
|
||||
|
||||
event_role_created = namespace.add_event_type(
|
||||
label=_('Role created'), name='role_created'
|
||||
)
|
||||
event_role_edited = namespace.add_event_type(
|
||||
label=_('Role edited'), name='role_edited'
|
||||
)
|
||||
@@ -4,6 +4,8 @@ from django.db import transaction
|
||||
|
||||
from mayan.apps.user_management.events import event_group_edited
|
||||
|
||||
from .events import event_role_edited
|
||||
|
||||
|
||||
def method_group_roles_add(self, queryset, _user):
|
||||
with transaction.atomic():
|
||||
@@ -12,6 +14,9 @@ def method_group_roles_add(self, queryset, _user):
|
||||
)
|
||||
for role in queryset:
|
||||
self.roles.add(role)
|
||||
event_role_edited.commit(
|
||||
actor=_user, action_object=self, target=role
|
||||
)
|
||||
|
||||
|
||||
def method_group_roles_remove(self, queryset, _user):
|
||||
@@ -21,3 +26,7 @@ def method_group_roles_remove(self, queryset, _user):
|
||||
)
|
||||
for role in queryset:
|
||||
self.roles.remove(role)
|
||||
event_role_edited.commit(
|
||||
actor=_user, action_object=self, target=role
|
||||
)
|
||||
|
||||
|
||||
@@ -3,12 +3,13 @@ from __future__ import unicode_literals
|
||||
import logging
|
||||
|
||||
from django.contrib.auth.models import Group
|
||||
from django.db import models
|
||||
from django.db import models, transaction
|
||||
from django.urls import reverse
|
||||
from django.utils.encoding import force_text, python_2_unicode_compatible
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .classes import Permission
|
||||
from .events import event_role_created, event_role_edited
|
||||
from .managers import RoleManager, StoredPermissionManager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -121,3 +122,18 @@ class Role(models.Model):
|
||||
def natural_key(self):
|
||||
return (self.label,)
|
||||
natural_key.dependencies = ['auth.Group', 'permissions.StoredPermission']
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
_user = kwargs.pop('_user', None)
|
||||
|
||||
with transaction.atomic():
|
||||
is_new = not self.pk
|
||||
super(Role, self).save(*args, **kwargs)
|
||||
if is_new:
|
||||
event_role_created.commit(
|
||||
actor=_user, target=self
|
||||
)
|
||||
else:
|
||||
event_role_edited.commit(
|
||||
actor=_user, target=self
|
||||
)
|
||||
|
||||
@@ -100,12 +100,19 @@ class RoleTestMixin(object):
|
||||
|
||||
class RoleViewTestMixin(object):
|
||||
def _request_test_role_create_view(self):
|
||||
return self.post(
|
||||
# Typecast to list to force queryset evaluation
|
||||
values = list(Role.objects.values_list('pk', flat=True))
|
||||
|
||||
response = self.post(
|
||||
viewname='permissions:role_create', data={
|
||||
'label': TEST_ROLE_LABEL,
|
||||
}
|
||||
)
|
||||
|
||||
self.test_role = Role.objects.exclude(pk__in=values).first()
|
||||
|
||||
return response
|
||||
|
||||
def _request_test_role_delete_view(self):
|
||||
return self.post(
|
||||
viewname='permissions:role_delete', kwargs={'pk': self.test_role.pk}
|
||||
|
||||
56
mayan/apps/permissions/tests/test_events.py
Normal file
56
mayan/apps/permissions/tests/test_events.py
Normal file
@@ -0,0 +1,56 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from actstream.models import Action
|
||||
|
||||
from mayan.apps.common.tests import GenericViewTestCase
|
||||
|
||||
from ..events import event_role_created, event_role_edited
|
||||
from ..permissions import permission_role_create, permission_role_edit
|
||||
|
||||
from .mixins import RoleTestMixin, RoleViewTestMixin
|
||||
|
||||
|
||||
class RoleEventsTestCase(RoleTestMixin, RoleViewTestMixin, GenericViewTestCase):
|
||||
def test_role_created_event_no_permissions(self):
|
||||
Action.objects.all().delete()
|
||||
|
||||
response = self._request_test_role_create_view()
|
||||
self.assertEqual(response.status_code, 403)
|
||||
self.assertEqual(Action.objects.count(), 0)
|
||||
|
||||
def test_role_created_event_with_permissions(self):
|
||||
Action.objects.all().delete()
|
||||
|
||||
self.grant_permission(permission=permission_role_create)
|
||||
response = self._request_test_role_create_view()
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
event = Action.objects.first()
|
||||
|
||||
self.assertEqual(event.verb, event_role_created.id)
|
||||
self.assertEqual(event.target, self.test_role)
|
||||
self.assertEqual(event.actor, self._test_case_user)
|
||||
|
||||
def test_role_edited_event_no_permissions(self):
|
||||
self._create_test_role()
|
||||
Action.objects.all().delete()
|
||||
|
||||
response = self._request_test_role_edit_view()
|
||||
self.assertEqual(response.status_code, 403)
|
||||
self.assertEqual(Action.objects.count(), 0)
|
||||
|
||||
def test_role_edited_event_with_access(self):
|
||||
self._create_test_role()
|
||||
Action.objects.all().delete()
|
||||
|
||||
self.grant_access(
|
||||
obj=self.test_role, permission=permission_role_edit
|
||||
)
|
||||
|
||||
response = self._request_test_role_edit_view()
|
||||
self.assertEqual(response.status_code, 302)
|
||||
event = Action.objects.first()
|
||||
|
||||
self.assertEqual(event.verb, event_role_edited.id)
|
||||
self.assertEqual(event.target, self.test_role)
|
||||
self.assertEqual(event.actor, self._test_case_user)
|
||||
@@ -55,6 +55,9 @@ class RoleCreateView(SingleObjectCreateView):
|
||||
view_permission = permission_role_create
|
||||
post_action_redirect = reverse_lazy('permissions:role_list')
|
||||
|
||||
def get_save_extra_data(self):
|
||||
return {'_user': self.request.user}
|
||||
|
||||
|
||||
class RoleDeleteView(SingleObjectDeleteView):
|
||||
model = Role
|
||||
@@ -67,6 +70,9 @@ class RoleEditView(SingleObjectEditView):
|
||||
model = Role
|
||||
object_permission = permission_role_edit
|
||||
|
||||
def get_save_extra_data(self):
|
||||
return {'_user': self.request.user}
|
||||
|
||||
|
||||
class SetupRoleMembersView(AssignRemoveView):
|
||||
grouped = False
|
||||
|
||||
Reference in New Issue
Block a user