canaille-globuzma/canaille/core/endpoints/groups.py

167 lines
4.8 KiB
Python
Raw Normal View History

from flask import Blueprint
from flask import abort
from flask import flash
from flask import redirect
from flask import request
from flask import url_for
from canaille.app import models
2023-04-09 13:52:55 +00:00
from canaille.app.flask import permissions_needed
from canaille.app.flask import render_htmx_template
from canaille.app.forms import TableForm
from canaille.app.i18n import gettext as _
from canaille.app.themes import render_template
from canaille.backends import Backend
2021-07-01 16:21:20 +00:00
2022-12-27 20:32:21 +00:00
from .forms import CreateGroupForm
from .forms import DeleteGroupMemberForm
2022-12-27 20:32:21 +00:00
from .forms import EditGroupForm
2021-07-01 16:21:20 +00:00
2022-01-11 18:49:06 +00:00
bp = Blueprint("groups", __name__, url_prefix="/groups")
2021-07-01 16:21:20 +00:00
@bp.route("/", methods=["GET", "POST"])
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_groups")
2021-07-01 16:21:20 +00:00
def groups(user):
table_form = TableForm(models.Group, formdata=request.form)
if request.form and request.form.get("page") and not table_form.validate():
abort(404)
return render_htmx_template("groups.html", menuitem="groups", table_form=table_form)
2021-07-01 16:21:20 +00:00
2021-07-01 16:21:20 +00:00
@bp.route("/add", methods=("GET", "POST"))
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_groups")
2021-07-01 16:21:20 +00:00
def create_group(user):
2022-12-27 20:32:21 +00:00
form = CreateGroupForm(request.form or None)
2021-07-01 16:21:20 +00:00
if request.form:
if not form.validate():
flash(_("Group creation failed."), "error")
else:
group = models.Group()
group.members = [user]
group.display_name = form.display_name.data
group.description = form.description.data
Backend.instance.save(group)
flash(
_(
"The group %(group)s has been sucessfully created",
group=group.display_name,
),
"success",
)
return redirect(url_for("core.groups.group", group=group))
2023-03-15 16:27:32 +00:00
return render_template(
"group.html", menuitem="groups", form=form, edited_group=None, members=None
)
2021-07-01 16:21:20 +00:00
2023-06-28 16:09:25 +00:00
@bp.route("/<group:group>", methods=("GET", "POST"))
2021-12-02 17:23:14 +00:00
@permissions_needed("manage_groups")
2023-06-28 16:09:25 +00:00
def group(user, group):
if (
request.method == "GET"
or request.form.get("action") == "edit"
or request.form.get("page")
):
2021-07-29 09:37:02 +00:00
return edit_group(group)
if request.form.get("action") == "confirm-delete":
return render_template("modals/delete-group.html", group=group)
2021-07-29 09:37:02 +00:00
if request.form.get("action") == "delete":
return delete_group(group)
if request.form.get("action") == "confirm-remove-member":
return delete_member(group)
if request.form.get("action") == "remove-member":
return delete_member(group)
abort(400, f"bad form action: {request.form.get('action')}")
2021-07-29 09:37:02 +00:00
2021-07-29 09:37:02 +00:00
def edit_group(group):
table_form = TableForm(models.User, filter={"groups": group}, formdata=request.form)
if request.form and request.form.get("page") and not table_form.validate():
abort(404)
2022-12-27 20:32:21 +00:00
form = EditGroupForm(
2021-12-10 16:08:43 +00:00
request.form or None,
data={
"display_name": group.display_name,
"description": group.description or "",
2021-12-10 16:08:43 +00:00
},
)
2021-07-01 16:21:20 +00:00
if (
request.form
and request.form.get("action") == "edit"
and not request.form.get("page")
):
2021-07-01 16:21:20 +00:00
if form.validate():
group.description = form.description.data
Backend.instance.save(group)
2022-12-27 20:32:21 +00:00
flash(
_(
"The group %(group)s has been sucessfully edited.",
group=group.display_name,
),
2022-12-27 20:32:21 +00:00
"success",
)
return redirect(url_for("core.groups.group", group=group))
2021-07-01 16:21:20 +00:00
else:
flash(_("Group edition failed."), "error")
return render_htmx_template(
"group.html",
"partial/group-members.html",
form=form,
2023-03-15 16:27:32 +00:00
menuitem="groups",
edited_group=group,
table_form=table_form,
2021-07-01 16:21:20 +00:00
)
def delete_member(group):
form = DeleteGroupMemberForm(request.form or None)
form.group = group
if not form.validate():
flash(
"\n".join(form.errors.get("member")),
"error",
)
elif request.form.get("action") == "confirm-remove-member":
return render_template(
"modals/remove-group-member.html", group=group, form=form
)
else:
flash(
_(
2024-05-01 16:39:59 +00:00
"%(user_name)s has been removed from the group %(group_name)s",
user_name=form.member.data.formatted_name,
group_name=group.display_name,
),
"success",
)
group.members = [
member for member in group.members if member != form.member.data
]
2024-05-03 20:35:23 +00:00
Backend.instance.save(group)
return edit_group(group)
2021-07-29 09:37:02 +00:00
def delete_group(group):
flash(
_("The group %(group)s has been sucessfully deleted", group=group.display_name),
"success",
)
Backend.instance.delete(group)
return redirect(url_for("core.groups.groups"))