ask for user confirmation if its role was moved out of presidency

This commit is contained in:
imperosol
2026-04-17 22:49:45 +02:00
parent 33902b4e15
commit 9c924c5b14
3 changed files with 46 additions and 11 deletions

View File

@@ -3,16 +3,22 @@ import type { AlpineComponent } from "alpinejs";
interface RoleGroupData {
isBoard: boolean;
isPresidency: boolean;
roleId: number;
}
document.addEventListener("alpine:init", () => {
Alpine.data("clubRoleList", () => ({
Alpine.data("clubRoleList", (config: { userRoleId: number | null }) => ({
confirmOnSubmit: false,
/**
* Edit relevant item data after it has been moved by x-sort
*/
reorder(item: AlpineComponent<RoleGroupData>, conf: RoleGroupData) {
item.isBoard = conf.isBoard;
item.isPresidency = conf.isPresidency;
// if the user has moved its own role outside the presidency,
// submitting the form will require a confirmation
this.confirmOnSubmit = config.userRoleId === item.roleId && !item.isPresidency;
this.resetOrder();
},
/**
@@ -33,5 +39,23 @@ document.addEventListener("alpine:init", () => {
elem.value = (i + 1).toString();
}
},
/**
* If the user moved its role out of the presidency, ask a confirmation
* before submitting the form
*/
confirmSubmission(event: SubmitEvent) {
if (
this.confirmOnSubmit &&
!confirm(
gettext(
"You're going to remove your own role from the presidency. " +
"You may lock yourself out of this page. Do you want to continue ? ",
),
)
) {
event.preventDefault();
}
},
}));
});

View File

@@ -14,6 +14,7 @@
x-data="{
isPresidency: {{ subform.is_presidency.value()|lower }},
isBoard: {{ subform.is_board.value()|lower }},
roleId: {{ subform.id.value() }},
}"
x-sort:item="$data"
>
@@ -68,7 +69,11 @@
(e.g. a board role can be made into a presidency role).
{% endtrans %}
</p>
<form method="post" x-data="clubRoleList">
<form
method="post"
x-data="clubRoleList({ userRoleId: {{ user_role or "null" }} })"
@submit="confirmSubmission"
>
{% csrf_token %}
{{ form.management_form }}
{{ form.non_form_errors() }}
@@ -91,7 +96,6 @@
<div
x-sort="reorder($item, { isBoard: true, isPresidency: true })"
x-sort:group="roles"
x-ref="presidencyFormSet"
>
{% for subform in form %}
{% if subform.is_presidency.value() %}
@@ -125,7 +129,6 @@
<div
x-sort="reorder($item, { isBoard: true, isPresidency: false })"
x-sort:group="roles"
x-ref="boardFormSet"
>
{% for subform in form %}
{% if subform.is_board.value() and not subform.is_presidency.value() %}
@@ -144,7 +147,6 @@
<div
x-sort="reorder($item, { isBoard: false, isPresidency: false })"
x-sort:group="roles"
x-ref="memberFormSet"
>
{% for subform in form %}
{% if not subform.is_board.value() %}

View File

@@ -431,12 +431,10 @@ class ClubRoleUpdateView(
success_message = _("Club roles updated")
def test_func(self):
if self.request.user.has_perm("club.change_clubrole"):
return True
club: Club = self.get_object()
return club.members.filter(
user=self.request.user, role__is_presidency=True
).exists()
return (
self.request.user.is_authenticated
and self.get_object().can_roles_be_edited_by(self.request.user)
)
def get_form_kwargs(self):
return super().get_form_kwargs() | {"form_kwargs": {"label_suffix": ""}}
@@ -444,6 +442,17 @@ class ClubRoleUpdateView(
def get_success_url(self):
return self.request.path
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs) | {
"user_role": ClubRole.objects.filter(
club=self.object,
members__user=self.request.user,
members__end_date=None,
)
.values_list("id", flat=True)
.first()
}
class ClubRoleBaseCreateView(UserPassesTestMixin, SuccessMessageMixin, CreateView):
"""View to create a new Club Role, using [][club.forms.ClubRoleCreateForm].