diff --git a/HISTORY.rst b/HISTORY.rst index 0a9e9daab8..a387c953f2 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -148,6 +148,7 @@ default submit and cancel. * Update ChoiceForm to be full height. * Add AddRemoveView to replace AssignRemoveView +* Update the group roles view to use the new AddRemoveView. 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index c16898a110..98522885f0 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -180,6 +180,7 @@ Other changes default submit and cancel. * Update ChoiceForm to be full height. * Add AddRemoveView to replace AssignRemoveView +* Update the group roles view to use the new AddRemoveView. Removals -------- diff --git a/mayan/apps/permissions/apps.py b/mayan/apps/permissions/apps.py index beafc3915e..80cf2c7f9e 100644 --- a/mayan/apps/permissions/apps.py +++ b/mayan/apps/permissions/apps.py @@ -18,6 +18,7 @@ from .links import ( link_group_roles, link_role_create, link_role_delete, link_role_edit, link_role_groups, link_role_list, link_role_permissions ) +from .methods import method_group_roles_add, method_group_roles_remove from .permissions import ( permission_role_delete, permission_role_edit, permission_role_view ) @@ -38,6 +39,9 @@ class PermissionsApp(MayanAppConfig): Role = self.get_model('Role') Group = apps.get_model(app_label='auth', model_name='Group') + Group.add_to_class(name='roles_add', value=method_group_roles_add) + Group.add_to_class(name='roles_remove', value=method_group_roles_remove) + ModelPermission.register( model=Role, permissions=( permission_acl_edit, permission_acl_view, diff --git a/mayan/apps/permissions/methods.py b/mayan/apps/permissions/methods.py new file mode 100644 index 0000000000..e3ea0c70d5 --- /dev/null +++ b/mayan/apps/permissions/methods.py @@ -0,0 +1,23 @@ +from __future__ import unicode_literals + +from django.db import transaction + +from mayan.apps.user_management.events import event_group_edited + + +def method_group_roles_add(self, queryset, _user): + with transaction.atomic(): + event_group_edited.commit( + actor=_user, target=self + ) + for role in queryset: + self.roles.add(role) + + +def method_group_roles_remove(self, queryset, _user): + with transaction.atomic(): + event_group_edited.commit( + actor=_user, target=self + ) + for role in queryset: + self.roles.remove(role) diff --git a/mayan/apps/permissions/urls.py b/mayan/apps/permissions/urls.py index 6bd5f52a16..3cf84ecfcd 100644 --- a/mayan/apps/permissions/urls.py +++ b/mayan/apps/permissions/urls.py @@ -4,14 +4,14 @@ from django.conf.urls import url from .api_views import APIPermissionList, APIRoleListView, APIRoleView from .views import ( - GroupRoleMembersView, RoleCreateView, RoleDeleteView, RoleEditView, + GroupRolesView, RoleCreateView, RoleDeleteView, RoleEditView, RoleListView, SetupRoleMembersView, SetupRolePermissionsView ) urlpatterns = [ url( regex=r'^group/(?P\d+)/roles/$', - view=GroupRoleMembersView.as_view(), name='group_roles' + view=GroupRolesView.as_view(), name='group_roles' ), url(regex=r'^role/list/$', view=RoleListView.as_view(), name='role_list'), url( diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index d5e06dc1d8..54952b7c6b 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -10,6 +10,7 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from mayan.apps.acls.models import AccessControlList +from mayan.apps.common.generics import AddRemoveView from mayan.apps.common.views import ( AssignRemoveView, SingleObjectCreateView, SingleObjectDeleteView, SingleObjectEditView, SingleObjectListView @@ -26,39 +27,27 @@ from .permissions import ( ) -class GroupRoleMembersView(AssignRemoveView): - grouped = False - left_list_title = _('Available roles') - right_list_title = _('Group roles') - object_permission = permission_group_edit +class GroupRolesView(AddRemoveView): + action_add_method = 'roles_add' + action_remove_method = 'roles_remove' + main_object_model = Group + main_object_permission = permission_group_edit + main_object_pk_url_kwarg = 'pk' + secondary_object_model = Role + secondary_object_permission = permission_role_edit + list_available_title = _('Available roles') + list_added_title = _('Group roles') + related_field = 'roles' - def add(self, item): - role = get_object_or_404(klass=Role, pk=item) - self.get_object().roles.add(role) + def get_actions_extra_kwargs(self): + return {'_user': self.request.user} def get_extra_context(self): return { - 'object': self.get_object(), - 'title': _('Roles of group: %s') % self.get_object() + 'object': self.main_object, + 'title': _('Roles of group: %s') % self.main_object, } - def get_object(self): - return get_object_or_404(klass=Group, pk=self.kwargs['pk']) - - def left_list(self): - return [ - (force_text(role.pk), role.label) for role in set(Role.objects.all()) - set(self.get_object().roles.all()) - ] - - def right_list(self): - return [ - (force_text(role.pk), role.label) for role in self.get_object().roles.all() - ] - - def remove(self, item): - role = get_object_or_404(klass=Role, pk=item) - self.get_object().roles.remove(role) - class RoleCreateView(SingleObjectCreateView): fields = ('label',)