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

123 lines
3.6 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
2021-07-01 16:21:20 +00:00
2022-12-27 20:32:21 +00:00
from .forms import CreateGroupForm
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
2021-07-01 16:21:20 +00:00
group.save()
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)
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 not request.form.get("page"):
2021-07-01 16:21:20 +00:00
if form.validate():
group.description = form.description.data
2021-07-01 16:21:20 +00:00
group.save()
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/users.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
)
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",
)
2021-07-29 09:37:02 +00:00
group.delete()
return redirect(url_for("core.groups.groups"))