Add role create and edit events

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-04-24 23:19:04 -04:00
parent 3f9421fc75
commit 5574aaec9e
9 changed files with 123 additions and 2 deletions

View File

@@ -149,6 +149,7 @@
* Update ChoiceForm to be full height. * Update ChoiceForm to be full height.
* Add AddRemoveView to replace AssignRemoveView * Add AddRemoveView to replace AssignRemoveView
* Update the group roles view to use the new AddRemoveView. * Update the group roles view to use the new AddRemoveView.
* Add role create and edit events.
3.1.11 (2019-04-XX) 3.1.11 (2019-04-XX)
=================== ===================

View File

@@ -181,6 +181,7 @@ Other changes
* Update ChoiceForm to be full height. * Update ChoiceForm to be full height.
* Add AddRemoveView to replace AssignRemoveView * Add AddRemoveView to replace AssignRemoveView
* Update the group roles view to use the new AddRemoveView. * Update the group roles view to use the new AddRemoveView.
* Add role create and edit events.
Removals Removals
-------- --------

View File

@@ -12,7 +12,9 @@ from mayan.apps.common.menus import (
menu_list_facet, menu_object, menu_secondary, menu_setup menu_list_facet, menu_object, menu_secondary, menu_setup
) )
from mayan.apps.common.signals import perform_upgrade 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 .handlers import purge_permissions
from .links import ( from .links import (
link_group_roles, link_role_create, link_role_delete, link_role_edit, link_group_roles, link_role_create, link_role_delete, link_role_edit,
@@ -35,6 +37,7 @@ class PermissionsApp(MayanAppConfig):
def ready(self): def ready(self):
super(PermissionsApp, self).ready() super(PermissionsApp, self).ready()
from actstream import registry
Role = self.get_model('Role') Role = self.get_model('Role')
Group = apps.get_model(app_label='auth', model_name='Group') 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_add', value=method_group_roles_add)
Group.add_to_class(name='roles_remove', value=method_group_roles_remove) 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( ModelPermission.register(
model=Role, permissions=( model=Role, permissions=(
permission_acl_edit, permission_acl_view, permission_acl_edit, permission_acl_view,
@@ -72,3 +79,5 @@ class PermissionsApp(MayanAppConfig):
perform_upgrade.connect( perform_upgrade.connect(
purge_permissions, dispatch_uid='purge_permissions' purge_permissions, dispatch_uid='purge_permissions'
) )
registry.register(Role)

View 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'
)

View File

@@ -4,6 +4,8 @@ from django.db import transaction
from mayan.apps.user_management.events import event_group_edited from mayan.apps.user_management.events import event_group_edited
from .events import event_role_edited
def method_group_roles_add(self, queryset, _user): def method_group_roles_add(self, queryset, _user):
with transaction.atomic(): with transaction.atomic():
@@ -12,6 +14,9 @@ def method_group_roles_add(self, queryset, _user):
) )
for role in queryset: for role in queryset:
self.roles.add(role) self.roles.add(role)
event_role_edited.commit(
actor=_user, action_object=self, target=role
)
def method_group_roles_remove(self, queryset, _user): def method_group_roles_remove(self, queryset, _user):
@@ -21,3 +26,7 @@ def method_group_roles_remove(self, queryset, _user):
) )
for role in queryset: for role in queryset:
self.roles.remove(role) self.roles.remove(role)
event_role_edited.commit(
actor=_user, action_object=self, target=role
)

View File

@@ -3,12 +3,13 @@ from __future__ import unicode_literals
import logging import logging
from django.contrib.auth.models import Group 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.urls import reverse
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .classes import Permission from .classes import Permission
from .events import event_role_created, event_role_edited
from .managers import RoleManager, StoredPermissionManager from .managers import RoleManager, StoredPermissionManager
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -121,3 +122,18 @@ class Role(models.Model):
def natural_key(self): def natural_key(self):
return (self.label,) return (self.label,)
natural_key.dependencies = ['auth.Group', 'permissions.StoredPermission'] 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
)

View File

@@ -100,12 +100,19 @@ class RoleTestMixin(object):
class RoleViewTestMixin(object): class RoleViewTestMixin(object):
def _request_test_role_create_view(self): 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={ viewname='permissions:role_create', data={
'label': TEST_ROLE_LABEL, 'label': TEST_ROLE_LABEL,
} }
) )
self.test_role = Role.objects.exclude(pk__in=values).first()
return response
def _request_test_role_delete_view(self): def _request_test_role_delete_view(self):
return self.post( return self.post(
viewname='permissions:role_delete', kwargs={'pk': self.test_role.pk} viewname='permissions:role_delete', kwargs={'pk': self.test_role.pk}

View 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)

View File

@@ -55,6 +55,9 @@ class RoleCreateView(SingleObjectCreateView):
view_permission = permission_role_create view_permission = permission_role_create
post_action_redirect = reverse_lazy('permissions:role_list') post_action_redirect = reverse_lazy('permissions:role_list')
def get_save_extra_data(self):
return {'_user': self.request.user}
class RoleDeleteView(SingleObjectDeleteView): class RoleDeleteView(SingleObjectDeleteView):
model = Role model = Role
@@ -67,6 +70,9 @@ class RoleEditView(SingleObjectEditView):
model = Role model = Role
object_permission = permission_role_edit object_permission = permission_role_edit
def get_save_extra_data(self):
return {'_user': self.request.user}
class SetupRoleMembersView(AssignRemoveView): class SetupRoleMembersView(AssignRemoveView):
grouped = False grouped = False