diff --git a/lumi2/templates/usermanager/group_edit.html b/lumi2/templates/usermanager/group_edit.html new file mode 100644 index 0000000..02a6832 --- /dev/null +++ b/lumi2/templates/usermanager/group_edit.html @@ -0,0 +1,46 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Editing group: {{ group.groupname }}

+
+
+
+ {{ form.csrf_token }} +
+
+ {{ form.members.label(class="form-label") }} + {{ form.members(class="form-control" + (" is-invalid" if form.members.errors else "")) }} + {% if form.members.errors %} + {% for error in form.members.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+ List of members of this group. +
+
+
+ {{ form.non_members.label(class="form-label") }} + {{ form.non_members(class="form-control" + (" is-invalid" if form.non_members.errors else "")) }} + {% if form.non_members.errors %} + {% for error in form.non_members.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+ List of users who are not members of this group. +
+
+
+
+
+ Reset + {{ form.submit(class_="btn btn-primary") }} +
+
+
+{% endblock content %} diff --git a/lumi2/usermanager.py b/lumi2/usermanager.py index 9ea6782..8bbef5f 100644 --- a/lumi2/usermanager.py +++ b/lumi2/usermanager.py @@ -9,7 +9,7 @@ from flask import ( from PIL import Image, UnidentifiedImageError from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed -from wtforms import ValidationError, StringField, PasswordField, SubmitField +from wtforms import ValidationError, StringField, PasswordField, SubmitField, SelectMultipleField from wtforms.validators import InputRequired, Email, EqualTo import lumi2.ldap as ldap @@ -300,3 +300,50 @@ def user_delete(username: str): username=user.username, deleted_groups=deleted_groups, ) + + +class GroupUpdateForm(FlaskForm): + members = SelectMultipleField( + 'Group members', + validators=[InputRequired()], + ) + + non_members = SelectMultipleField( + 'Other users', + ) + + submit = SubmitField( + 'Update', + ) + + +@bp.route("/groups/update/") +def group_update(groupname: str): + """Detail and Update view for a group. + + Shows a form allowing the modification of user memberships for this group. + """ + + try: + conn = ldap.get_connection() + except Exception: + abort(500) + + try: + group = ldap.get_group(conn, groupname) + except ldap.EntryNotFoundException: + conn.unbind() + abort(404) + + form = GroupUpdateForm() + form.members.choices = sorted({user.username for user in group.members}) + form.non_members.choices = sorted( + {user.username for user in ldap.get_users(conn)} - set(form.members.choices) + ) + + conn.unbind() + return render_template( + 'usermanager/group_edit.html', + form=form, + group=group, + )