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.
* 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)
===================

View File

@@ -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
--------

View File

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

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

View File

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

View File

@@ -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}

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