diff --git a/HISTORY.rst b/HISTORY.rst index 4592ee76e4..793a753f9a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -164,6 +164,9 @@ * Use the 'handler' prefix for all the signal handler functions. * Remove custom email widget and use Django's. * Increase default maximum number of favorite documents to 400. +* Update the role group list view to use the new AddRemoveView. +* Commit the group event in conjunction with the role event + when a group is added or remove from role. 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index 477c9cc033..8cc651e75f 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -196,6 +196,9 @@ Other changes * Use the 'handler' prefix for all the signal handler functions. * Remove custom email widget and use Django's. * Increase default maximum number of favorite documents to 400. +* Update the role group list view to use the new AddRemoveView. +* Commit the group event in conjunction with the role event + when a group is added or remove from role. Removals -------- diff --git a/mayan/apps/permissions/models.py b/mayan/apps/permissions/models.py index c00435e01c..5ebde5d80e 100644 --- a/mayan/apps/permissions/models.py +++ b/mayan/apps/permissions/models.py @@ -8,6 +8,8 @@ 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 mayan.apps.user_management.events import event_group_edited + from .classes import Permission from .events import event_role_created, event_role_edited from .managers import RoleManager, StoredPermissionManager @@ -119,6 +121,28 @@ class Role(models.Model): def grant(self, permission): self.permissions.add(permission.stored_permission) + def groups_add(self, queryset, _user=None): + with transaction.atomic(): + event_role_edited.commit( + actor=_user, target=self + ) + for obj in queryset: + self.groups.add(obj) + event_group_edited.commit( + actor=_user, action_object=self, target=obj + ) + + def groups_remove(self, queryset, _user=None): + with transaction.atomic(): + event_role_edited.commit( + actor=_user, target=self + ) + for obj in queryset: + self.groups.remove(obj) + event_group_edited.commit( + actor=_user, action_object=self, target=obj + ) + def natural_key(self): return (self.label,) natural_key.dependencies = ['auth.Group', 'permissions.StoredPermission'] diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index 51c21d98fe..9647fae190 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -73,43 +73,31 @@ class RoleEditView(SingleObjectEditView): return {'_user': self.request.user} -class SetupRoleMembersView(AssignRemoveView): - grouped = False - left_list_title = _('Available groups') - right_list_title = _('Role groups') - object_permission = permission_role_edit +class SetupRoleMembersView(AddRemoveView): + action_add_method = 'groups_add' + action_remove_method = 'groups_remove' + main_object_model = Role + main_object_permission = permission_role_edit + main_object_pk_url_kwarg = 'pk' + secondary_object_model = Group + secondary_object_permission = permission_group_edit + list_available_title = _('Available groups') + list_added_title = _('Role groups') + related_field = 'groups' - def add(self, item): - group = get_object_or_404(klass=Group, pk=item) - self.get_object().groups.add(group) + def get_actions_extra_kwargs(self): + return {'_user': self.request.user} def get_extra_context(self): return { - 'object': self.get_object(), - 'title': _('Groups of role: %s') % self.get_object(), + 'object': self.main_object, + 'title': _('Groups of role: %s') % self.main_object, 'subtitle': _( 'Add groups to be part of a role. They will ' 'inherit the role\'s permissions and access controls.' ), } - def get_object(self): - return get_object_or_404(klass=Role, pk=self.kwargs['pk']) - - def left_list(self): - return [ - (force_text(group.pk), group.name) for group in set(Group.objects.all()) - set(self.get_object().groups.all()) - ] - - def right_list(self): - return [ - (force_text(group.pk), group.name) for group in self.get_object().groups.all() - ] - - def remove(self, item): - group = get_object_or_404(klass=Group, pk=item) - self.get_object().groups.remove(group) - class SetupRolePermissionsView(AssignRemoveView): grouped = True