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.
|
* 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)
|
||||||
===================
|
===================
|
||||||
|
|||||||
@@ -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
|
||||||
--------
|
--------
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
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 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
|
||||||
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
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
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user