Add more features to circle editor

- Manage members
- Update name

(Normally, I’d fix this up into the initial implementation
commit, but things happened in between and the rebase would be
painful.)
This commit is contained in:
Jonas Schäfer
2021-01-21 17:35:42 +01:00
parent ff870ae71e
commit e18b733017
6 changed files with 200 additions and 35 deletions

View File

@@ -272,6 +272,12 @@ async def create_circle() -> typing.Union[str, quart.Response]:
class EditCircleForm(flask_wtf.FlaskForm): # type:ignore
name = wtforms.StringField(
_l("Name"),
validators=[wtforms.validators.InputRequired()],
)
user_to_add = wtforms.SelectField(
_l("Select user"),
validate_choice=False,
)
action_save = wtforms.SubmitField(
@@ -284,6 +290,10 @@ class EditCircleForm(flask_wtf.FlaskForm): # type:ignore
action_remove_user = wtforms.StringField()
action_add_user = wtforms.SubmitField(
_l("Add user")
)
@bp.route("/circle/<id_>", methods=["GET", "POST"])
@client.require_admin_session()
@@ -307,22 +317,51 @@ async def edit_circle(id_: str) -> typing.Union[str, quart.Response]:
for localpart in sorted(circle.members)
))
users = await client.list_users()
form = EditCircleForm()
form.user_to_add.choices = sorted(
(
(u.localpart, u.localpart)
for u in users
if u.localpart not in circle.members
),
key=lambda x: x[1]
)
valid_users = [x[0] for x in form.user_to_add.choices]
invite_form = InvitePost()
await invite_form.init_choices()
invite_form.circles.data = [id_]
if request.method != "POST":
form.name.data = circle.name
if form.validate_on_submit():
if form.action_save.data:
# TODO: post update
pass
await client.update_group(
id_,
new_name=form.name.data,
)
elif form.action_delete.data:
await client.delete_group(id_)
return redirect(url_for(".circles"))
elif form.action_add_user.data:
if form.user_to_add.data in valid_users:
print("is valid")
await client.add_group_member(
id_,
form.user_to_add.data,
)
elif form.action_remove_user.data:
await client.remove_group_member(
id_,
form.action_remove_user.data,
)
return redirect(url_for(".edit_circle", id_=id_))
else:
print(form.errors)
return await render_template(
"admin_edit_circle.html",

View File

@@ -108,7 +108,7 @@ class AdminGroupInfo:
return cls(
id_=data["id"],
name=data["name"],
members=data["members"],
members=data.get("members", []),
)
@@ -924,7 +924,47 @@ class ProsodyClient:
new_name: typing.Optional[str] = None,
session: aiohttp.ClientSession,
) -> AdminGroupInfo:
pass
payload = {}
if new_name is not None:
payload["name"] = new_name
async with session.put(
self._admin_v1_endpoint(
"/groups/{}".format(id_)
),
json=payload,
) as resp:
self._raise_error_from_response(resp)
@autosession
async def add_group_member(
self,
id_: str,
localpart: str,
*,
session: aiohttp.ClientSession,
) -> None:
async with session.put(
self._admin_v1_endpoint(
"/groups/{}/members/{}".format(id_, localpart)
),
) as resp:
self._raise_error_from_response(resp)
@autosession
async def remove_group_member(
self,
id_: str,
localpart: str,
*,
session: aiohttp.ClientSession,
) -> None:
async with session.delete(
self._admin_v1_endpoint(
"/groups/{}/members/{}".format(id_, localpart)
),
) as resp:
self._raise_error_from_response(resp)
@autosession
async def delete_group(

View File

@@ -2,9 +2,10 @@
{% from "library.j2" import form_button, standard_button, value_or_hint, custom_form_button %}
{% block content %}
<h1>{% trans circle_name=(target_circle | circle_name) %}Edit circle {{ circle_name }}{% endtrans %}</h1>
<div class="form layout-expanded"><form method="POST">
<form method="POST">
{{- form.csrf_token -}}
<div class="form layout-expanded">
<h2 class="form-title">{% trans %}Circle information{% endtrans %}</h2>
{{ form.csrf_token }}
<div class="f-ebox">
{{ form.name.label }}
{{ form.name }}
@@ -22,6 +23,7 @@
</div>
</div>
<h2>{% trans %}Circle members{% endtrans %}</h2>
{%- if circle_members -%}
<div class="el-2 elevated"><table>
<thead>
<th>Login name</th>
@@ -42,7 +44,27 @@
{%- endfor -%}
</tbody>
</table></div>
</form>
{%- else -%}
<p>{% trans %}This circle currently has no members.{% endtrans %}</p>
{%- endif -%}
<h3>{% trans %}Invite more members{% endtrans %}</h3>
{%- if form.user_to_add.choices -%}
<div class="form layout-expanded">
<h4 class="form-title">{% trans %}Add existing user{% endtrans %}</h4>
<div class="f-ebox">
{{- form.user_to_add.label -}}
<div class="select-wrap">{{ form.user_to_add }}</div>
</div>
<div class="f-bbox">
{%- call form_button("add", form.action_add_user, class="primary") %}{% endcall -%}
</div>
</div>
{%- else -%}
<div class="box hint el-2">
<header>{% trans %}No users left{% endtrans %}</header>
<p>{% trans %}All users on this instance are already in this circle.{% endtrans %}</p>
</div>
{%- endif -%}
</form>
{%- include "admin_create_invite_form.html" -%}
{% endblock %}

View File

@@ -34,7 +34,12 @@
{#- -#}
<ul class="inline">
{%- for group_id in invite.group_ids -%}
{%- set circle_info = circle_map[group_id] -%}
{%- if circle_info -%}
<li>{{ circle_map[group_id] | circle_name }}</li>
{%- else -%}
<li><em>{% trans %}deleted{% endtrans %}</em></li>
{%- endif -%}
{%- endfor -%}
</ul>
{#- -#}

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SnikketWeb 0.1.0\n"
"Report-Msgid-Bugs-To: jonas@zombofant.net\n"
"POT-Creation-Date: 2021-01-21 17:00+0100\n"
"POT-Creation-Date: 2021-01-21 17:39+0100\n"
"PO-Revision-Date: 2020-03-07 16:32+0100\n"
"Last-Translator: Jonas Schäfer <jonas@zombofant.net>\n"
"Language: de\n"
@@ -74,14 +74,22 @@ msgstr "Name"
msgid "Create circle"
msgstr "Gemeinschaft gründen"
#: snikket_web/admin.py:278 snikket_web/user.py:68
#: snikket_web/admin.py:279
msgid "Select user"
msgstr "Benutzer auswählen"
#: snikket_web/admin.py:284 snikket_web/user.py:68
msgid "Apply"
msgstr "Übernehmen"
#: snikket_web/admin.py:282
#: snikket_web/admin.py:288
msgid "Delete circle permanently"
msgstr "Gemeinschaft endgültig löschen"
#: snikket_web/admin.py:294
msgid "Add user"
msgstr "Benutzer hinzufügen"
#: snikket_web/infra.py:40
msgid "Main"
msgstr "Kern"
@@ -334,7 +342,7 @@ msgid "Danger"
msgstr "Gefahr"
#: snikket_web/templates/admin_delete_user.html:23
#: snikket_web/templates/admin_edit_circle.html:14
#: snikket_web/templates/admin_edit_circle.html:15
#: snikket_web/templates/admin_edit_invite.html:45
#: snikket_web/templates/user_logout.html:13
#: snikket_web/templates/user_passwd.html:40
@@ -347,33 +355,49 @@ msgstr "Zurück"
msgid "Edit circle %(circle_name)s"
msgstr "Gemeinschaft %(circle_name)s bearbeiten"
#: snikket_web/templates/admin_edit_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:8
msgid "Circle information"
msgstr "Gemeinschaftsinformationen"
#: snikket_web/templates/admin_edit_circle.html:18
#: snikket_web/templates/admin_edit_circle.html:19
msgid "Delete circle"
msgstr "Gemeinschaft löschen"
#: snikket_web/templates/admin_edit_circle.html:19
#: snikket_web/templates/admin_edit_circle.html:20
msgid "Deleting a circle does not delete any users in the circle."
msgstr ""
"Wenn eine Gemeinschaft gelöscht wird, werden die Benutzer die zu dieser "
"Gemeinschaft gehören nicht gelöscht."
#: snikket_web/templates/admin_edit_circle.html:24
#: snikket_web/templates/admin_edit_circle.html:25
msgid "Circle members"
msgstr "Mitglieder der Gemeinschaft"
#: snikket_web/templates/admin_edit_circle.html:38
#: snikket_web/templates/admin_edit_circle.html:40
#, python-format
msgid "Remove user %(username)s from circle"
msgstr "Benutzer %(username)s aus der Gemeinschaft entfernen"
#: snikket_web/templates/admin_edit_circle.html:46
#: snikket_web/templates/admin_edit_circle.html:48
msgid "This circle currently has no members."
msgstr "Diese Gemeinschaft hat derzeit keine Mitglieder."
#: snikket_web/templates/admin_edit_circle.html:50
msgid "Invite more members"
msgstr "Mehr Mitglieder einladen"
#: snikket_web/templates/admin_edit_circle.html:53
msgid "Add existing user"
msgstr "Bestehenden Benuzter hinzufügen"
#: snikket_web/templates/admin_edit_circle.html:64
msgid "No users left"
msgstr "Keine Benutzer übrig"
#: snikket_web/templates/admin_edit_circle.html:65
msgid "All users on this instance are already in this circle."
msgstr "Alle Benutzer dieser Instanz sind bereits in dieser Gemeinschaft."
#: snikket_web/templates/admin_edit_invite.html:8
msgid "View invitation"
msgstr "Einladung anzeigen"
@@ -505,19 +529,23 @@ msgstr "Ja"
msgid "No"
msgstr "Nein"
#: snikket_web/templates/admin_invites.html:44
#: snikket_web/templates/admin_invites.html:41
msgid "deleted"
msgstr "gelöscht"
#: snikket_web/templates/admin_invites.html:49
msgid "Show invite details"
msgstr "Einladungsdetails anzeigen"
#: snikket_web/templates/admin_invites.html:47
#: snikket_web/templates/admin_invites.html:52
msgid "Copy invite link to clipboard"
msgstr "Einladungslink kopieren"
#: snikket_web/templates/admin_invites.html:50
#: snikket_web/templates/admin_invites.html:55
msgid "Delete invitation"
msgstr "Einladung löschen"
#: snikket_web/templates/admin_invites.html:58
#: snikket_web/templates/admin_invites.html:63
msgid "Currently, there are no pending invitations."
msgstr "Derzeit gibt es keine ausstehenden Einladungen."

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-01-21 17:00+0100\n"
"POT-Creation-Date: 2021-01-21 17:39+0100\n"
"PO-Revision-Date: 2020-03-07 16:50+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@@ -74,14 +74,22 @@ msgstr ""
msgid "Create circle"
msgstr ""
#: snikket_web/admin.py:278 snikket_web/user.py:68
#: snikket_web/admin.py:279
msgid "Select user"
msgstr ""
#: snikket_web/admin.py:284 snikket_web/user.py:68
msgid "Apply"
msgstr ""
#: snikket_web/admin.py:282
#: snikket_web/admin.py:288
msgid "Delete circle permanently"
msgstr ""
#: snikket_web/admin.py:294
msgid "Add user"
msgstr ""
#: snikket_web/infra.py:40
msgid "Main"
msgstr ""
@@ -320,7 +328,7 @@ msgid "Danger"
msgstr ""
#: snikket_web/templates/admin_delete_user.html:23
#: snikket_web/templates/admin_edit_circle.html:14
#: snikket_web/templates/admin_edit_circle.html:15
#: snikket_web/templates/admin_edit_invite.html:45
#: snikket_web/templates/user_logout.html:13
#: snikket_web/templates/user_passwd.html:40
@@ -333,31 +341,47 @@ msgstr ""
msgid "Edit circle %(circle_name)s"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:8
msgid "Circle information"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:18
#: snikket_web/templates/admin_edit_circle.html:19
msgid "Delete circle"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:19
#: snikket_web/templates/admin_edit_circle.html:20
msgid "Deleting a circle does not delete any users in the circle."
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:24
#: snikket_web/templates/admin_edit_circle.html:25
msgid "Circle members"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:38
#: snikket_web/templates/admin_edit_circle.html:40
#, python-format
msgid "Remove user %(username)s from circle"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:46
#: snikket_web/templates/admin_edit_circle.html:48
msgid "This circle currently has no members."
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:50
msgid "Invite more members"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:53
msgid "Add existing user"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:64
msgid "No users left"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:65
msgid "All users on this instance are already in this circle."
msgstr ""
#: snikket_web/templates/admin_edit_invite.html:8
msgid "View invitation"
msgstr ""
@@ -479,19 +503,23 @@ msgstr ""
msgid "No"
msgstr ""
#: snikket_web/templates/admin_invites.html:44
#: snikket_web/templates/admin_invites.html:41
msgid "deleted"
msgstr ""
#: snikket_web/templates/admin_invites.html:49
msgid "Show invite details"
msgstr ""
#: snikket_web/templates/admin_invites.html:47
#: snikket_web/templates/admin_invites.html:52
msgid "Copy invite link to clipboard"
msgstr ""
#: snikket_web/templates/admin_invites.html:50
#: snikket_web/templates/admin_invites.html:55
msgid "Delete invitation"
msgstr ""
#: snikket_web/templates/admin_invites.html:58
#: snikket_web/templates/admin_invites.html:63
msgid "Currently, there are no pending invitations."
msgstr ""
@@ -665,3 +693,6 @@ msgstr ""
#~ "link."
#~ msgstr ""
#~ msgid "All users on this instance have already been added."
#~ msgstr ""