diff --git a/snikket_web/admin.py b/snikket_web/admin.py index b21a851..8a0e829 100644 --- a/snikket_web/admin.py +++ b/snikket_web/admin.py @@ -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/", 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", diff --git a/snikket_web/prosodyclient.py b/snikket_web/prosodyclient.py index bd27f0d..9aa869e 100644 --- a/snikket_web/prosodyclient.py +++ b/snikket_web/prosodyclient.py @@ -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( diff --git a/snikket_web/templates/admin_edit_circle.html b/snikket_web/templates/admin_edit_circle.html index cf05258..b884fd0 100644 --- a/snikket_web/templates/admin_edit_circle.html +++ b/snikket_web/templates/admin_edit_circle.html @@ -2,9 +2,10 @@ {% from "library.j2" import form_button, standard_button, value_or_hint, custom_form_button %} {% block content %}

{% trans circle_name=(target_circle | circle_name) %}Edit circle {{ circle_name }}{% endtrans %}

-
+ +{{- form.csrf_token -}} +

{% trans %}Circle information{% endtrans %}

- {{ form.csrf_token }}
{{ form.name.label }} {{ form.name }} @@ -22,6 +23,7 @@

{% trans %}Circle members{% endtrans %}

+{%- if circle_members -%}
@@ -42,7 +44,27 @@ {%- endfor -%}
Login name
-
+{%- else -%} +

{% trans %}This circle currently has no members.{% endtrans %}

+{%- endif -%}

{% trans %}Invite more members{% endtrans %}

+{%- if form.user_to_add.choices -%} +
+

{% trans %}Add existing user{% endtrans %}

+
+ {{- form.user_to_add.label -}} +
{{ form.user_to_add }}
+
+
+ {%- call form_button("add", form.action_add_user, class="primary") %}{% endcall -%} +
+
+{%- else -%} +
+
{% trans %}No users left{% endtrans %}
+

{% trans %}All users on this instance are already in this circle.{% endtrans %}

+
+{%- endif -%} + {%- include "admin_create_invite_form.html" -%} {% endblock %} diff --git a/snikket_web/templates/admin_invites.html b/snikket_web/templates/admin_invites.html index 8edbcef..e0b100e 100644 --- a/snikket_web/templates/admin_invites.html +++ b/snikket_web/templates/admin_invites.html @@ -34,7 +34,12 @@ {#- -#} {#- -#} diff --git a/snikket_web/translations/de/LC_MESSAGES/messages.po b/snikket_web/translations/de/LC_MESSAGES/messages.po index 79c7b39..c26699a 100644 --- a/snikket_web/translations/de/LC_MESSAGES/messages.po +++ b/snikket_web/translations/de/LC_MESSAGES/messages.po @@ -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 \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." diff --git a/snikket_web/translations/en/LC_MESSAGES/messages.po b/snikket_web/translations/en/LC_MESSAGES/messages.po index 6e4ef1f..100bef1 100644 --- a/snikket_web/translations/en/LC_MESSAGES/messages.po +++ b/snikket_web/translations/en/LC_MESSAGES/messages.po @@ -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 \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 "" +