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): ...@@ -222,7 +222,7 @@ class AssignGroupRoleForm(forms.ModelForm):
if "groups" in initial: if "groups" in initial:
self.fields["groups"].required = False 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 if not self.request.user.has_perm("alsijil.assign_grouprole"): # Global permission
persons = Person.objects persons = Person.objects
if initial.get("groups"): if initial.get("groups"):
...@@ -236,6 +236,12 @@ class AssignGroupRoleForm(forms.ModelForm): ...@@ -236,6 +236,12 @@ class AssignGroupRoleForm(forms.ModelForm):
persons = persons.filter(member_of__owners=self.request.user.person) persons = persons.filter(member_of__owners=self.request.user.person)
self.fields["person"].queryset = persons 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): def clean_groups(self):
"""Ensure that only permitted groups are used.""" """Ensure that only permitted groups are used."""
return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"] return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"]
......
...@@ -67,6 +67,17 @@ MENUS = { ...@@ -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"), "name": _("Excuse types"),
"url": "excuse_types", "url": "excuse_types",
......
...@@ -20,6 +20,7 @@ from .util.predicates import ( ...@@ -20,6 +20,7 @@ from .util.predicates import (
is_lesson_teacher, is_lesson_teacher,
is_none, is_none,
is_own_personal_note, is_own_personal_note,
is_owner_of_any_group,
is_person_group_owner, is_person_group_owner,
is_person_primary_group_owner, is_person_primary_group_owner,
is_personal_note_lesson_parent_group_owner, is_personal_note_lesson_parent_group_owner,
...@@ -258,6 +259,11 @@ assign_group_role_person_predicate = group_roles_activated_predicate & ( ...@@ -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) 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 assign_group_role_group_predicate = view_assigned_group_roles_predicate
add_perm("alsijil.assign_grouprole_for_group", assign_group_role_group_predicate) add_perm("alsijil.assign_grouprole_for_group", assign_group_role_group_predicate)
......
...@@ -5,10 +5,18 @@ ...@@ -5,10 +5,18 @@
{% load i18n rules any_js material_form %} {% load i18n rules any_js material_form %}
{% block browser_title %} {% 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 %} {% endblock %}
{% block page_title %} {% 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 %} {% endblock %}
{% block extra_head %} {% block extra_head %}
......
...@@ -87,4 +87,9 @@ urlpatterns = [ ...@@ -87,4 +87,9 @@ urlpatterns = [
views.GroupRoleAssignmentDeleteView.as_view(), views.GroupRoleAssignmentDeleteView.as_view(),
name="delete_group_role_assignment", 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]) ...@@ -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()): if user.person in list(group.owners.all()):
return True return True
return False 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 ...@@ -1024,6 +1024,23 @@ class AssignGroupRoleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCre
return context 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") @method_decorator(never_cache, name="dispatch")
class GroupRoleAssignmentEditView(PermissionRequiredMixin, SuccessNextMixin, AdvancedEditView): class GroupRoleAssignmentEditView(PermissionRequiredMixin, SuccessNextMixin, AdvancedEditView):
"""Edit view for group role assignments.""" """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