Skip to content
Snippets Groups Projects
Verified Commit 1b2a4793 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add global form to assign group roles

parent ccd49962
No related branches found
No related tags found
1 merge request!131Resolve "Add support for assinging group roles"
Pipeline #5675 passed
......@@ -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"]
......
......@@ -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",
......
......@@ -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)
......
......@@ -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 %}
......
......@@ -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",
),
]
......@@ -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()
......@@ -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."""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment