From 1b2a479363453ad31a069442f7f75bbb8c41f8e0 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Sat, 6 Feb 2021 16:17:57 +0100 Subject: [PATCH] Add global form to assign group roles --- aleksis/apps/alsijil/forms.py | 8 +++++++- aleksis/apps/alsijil/menus.py | 11 +++++++++++ aleksis/apps/alsijil/rules.py | 6 ++++++ .../templates/alsijil/group_role/assign.html | 12 ++++++++++-- aleksis/apps/alsijil/urls.py | 5 +++++ aleksis/apps/alsijil/util/predicates.py | 6 ++++++ aleksis/apps/alsijil/views.py | 17 +++++++++++++++++ 7 files changed, 62 insertions(+), 3 deletions(-) diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 9a3e7ac7b..bf6808809 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -222,7 +222,7 @@ class AssignGroupRoleForm(forms.ModelForm): if "groups" in initial: self.fields["groups"].required = False - # Filter persons by permissions + # Filter persons and groups by permissions if not self.request.user.has_perm("alsijil.assign_grouprole"): # Global permission persons = Person.objects if initial.get("groups"): @@ -236,6 +236,12 @@ class AssignGroupRoleForm(forms.ModelForm): persons = persons.filter(member_of__owners=self.request.user.person) self.fields["person"].queryset = persons + if "groups" not in initial: + groups = Group.objects.for_current_school_term_or_all().filter( + owners=self.request.user.person + ) + self.fields["groups"].queryset = groups + def clean_groups(self): """Ensure that only permitted groups are used.""" return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"] diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py index a5b5b687a..951ee5b8e 100644 --- a/aleksis/apps/alsijil/menus.py +++ b/aleksis/apps/alsijil/menus.py @@ -67,6 +67,17 @@ MENUS = { ), ], }, + { + "name": _("Assign group role"), + "url": "assign_group_role_multiple", + "icon": "assignment_ind", + "validators": [ + ( + "aleksis.core.util.predicates.permission_validator", + "alsijil.assign_grouprole_for_multiple", + ), + ], + }, { "name": _("Excuse types"), "url": "excuse_types", diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py index 4e7a84f0d..b1087a65b 100644 --- a/aleksis/apps/alsijil/rules.py +++ b/aleksis/apps/alsijil/rules.py @@ -20,6 +20,7 @@ from .util.predicates import ( is_lesson_teacher, is_none, is_own_personal_note, + is_owner_of_any_group, is_person_group_owner, is_person_primary_group_owner, is_personal_note_lesson_parent_group_owner, @@ -258,6 +259,11 @@ assign_group_role_person_predicate = group_roles_activated_predicate & ( ) add_perm("alsijil.assign_grouprole_to_person", assign_group_role_person_predicate) +assign_group_role_for_multiple_predicate = group_roles_activated_predicate & ( + is_owner_of_any_group | has_global_perm("alsjil.assign_grouprole") +) +add_perm("alsijil.assign_grouprole_for_multiple", assign_group_role_for_multiple_predicate) + assign_group_role_group_predicate = view_assigned_group_roles_predicate add_perm("alsijil.assign_grouprole_for_group", assign_group_role_group_predicate) diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html index 3405e8da5..a4a5ac137 100644 --- a/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html @@ -5,10 +5,18 @@ {% load i18n rules any_js material_form %} {% block browser_title %} - {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% if group %} + {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% else %} + {% trans "Assign group role" %} + {% endif %} {% endblock %} {% block page_title %} - {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% if group %} + {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% else %} + {% trans "Assign group role" %} + {% endif %} {% endblock %} {% block extra_head %} diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py index 0e007075d..864c862ae 100644 --- a/aleksis/apps/alsijil/urls.py +++ b/aleksis/apps/alsijil/urls.py @@ -87,4 +87,9 @@ urlpatterns = [ views.GroupRoleAssignmentDeleteView.as_view(), name="delete_group_role_assignment", ), + path( + "group_roles/assignments/assign/", + views.AssignGroupRoleMultipleView.as_view(), + name="assign_group_role_multiple", + ), ] diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py index c1d6d063e..e039a3b42 100644 --- a/aleksis/apps/alsijil/util/predicates.py +++ b/aleksis/apps/alsijil/util/predicates.py @@ -261,3 +261,9 @@ def is_group_role_assignment_group_owner(user: User, obj: Union[Group, Person]) if user.person in list(group.owners.all()): return True return False + + +@predicate +def is_owner_of_any_group(user: User, obj): + """Predicate which checks if the person is group owner of any group.""" + return Group.objects.filter(owners=user.person).exists() diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index aa60f2cb3..4b32660ac 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -1024,6 +1024,23 @@ class AssignGroupRoleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCre return context +@method_decorator(never_cache, name="dispatch") +class AssignGroupRoleMultipleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCreateView): + model = GroupRoleAssignment + form_class = AssignGroupRoleForm + permission_required = "alsijil.assign_grouprole_for_multiple" + template_name = "alsijil/group_role/assign.html" + success_message = _("The group role has been assigned.") + + def get_default_success_url(self) -> str: + return reverse("assign_group_role_multiple") + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs["request"] = self.request + return kwargs + + @method_decorator(never_cache, name="dispatch") class GroupRoleAssignmentEditView(PermissionRequiredMixin, SuccessNextMixin, AdvancedEditView): """Edit view for group role assignments.""" -- GitLab