From 6d50b1c2c7e5dca615e341f41c88d89487b2e393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= Date: Thu, 20 Jan 2022 18:07:55 +0100 Subject: [PATCH 1/9] Do not show dependency versions even to admins by default Dependency versions are generally not useful, unless you are developing or otherwise outside of a normal release situation: If you are on a normal release, we can figure out the dep versions by looking at the docker image. To reduce the amount of information displayed and the amount of information which needs to be conveyed in case of problems, we only show the web portal and prosody versions to admins, unless debug mode is enabled. The behaviour that versions are only shown to logged in admins (unless debug mode is enabled) remains unchanged. Fixes #115. --- snikket_web/main.py | 13 ++++++++----- snikket_web/templates/about.html | 9 ++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/snikket_web/main.py b/snikket_web/main.py index a3db81d..c1fb7cd 100644 --- a/snikket_web/main.py +++ b/snikket_web/main.py @@ -91,24 +91,27 @@ async def login() -> typing.Union[str, quart.Response]: @bp.route("/meta/about.html") async def about() -> str: version = None + core_versions = {} extra_versions = {} - if current_app.debug or client.is_admin_session: version = _version.version + try: + core_versions["Prosody"] = await client.get_server_version() + except quart.exceptions.Unauthorized: + core_versions["Prosody"] = "unknown" + + if current_app.debug: extra_versions["Quart"] = quart.__version__ extra_versions["aiohttp"] = aiohttp.__version__ extra_versions["babel"] = babel.__version__ extra_versions["wtforms"] = wtforms.__version__ extra_versions["flask-wtf"] = flask_wtf.__version__ - try: - extra_versions["Prosody"] = await client.get_server_version() - except quart.exceptions.Unauthorized: - extra_versions["Prosody"] = "unknown" return await render_template( "about.html", version=version, extra_versions=extra_versions, + core_versions=core_versions, ) diff --git a/snikket_web/templates/about.html b/snikket_web/templates/about.html index 001eb50..b6e4b05 100644 --- a/snikket_web/templates/about.html +++ b/snikket_web/templates/about.html @@ -17,9 +17,12 @@

{% trans %}Trademarks{% endtrans %}

{% trans trademarks_url="https://snikket.org/about/trademarks/" %}“Snikket” and the parrot logo are trademarks of Snikket Community Interest Company. For more information about the trademarks, visit the Snikket Trademarks information page.{% endtrans %}

{% trans %}Software Versions{% endtrans %}

-
Snikket Server
-Domain: {{ config["SNIKKET_DOMAIN"] }}
-Snikket Web Portal{% if version %} ({{ version }}){% endif %}
+		
Domain: {{ config["SNIKKET_DOMAIN"] }}
+Web Portal{% if version %} ({{ version }}){% endif %}
+{%- if core_versions -%}
+{% for name, version in core_versions.items() %}
+{{ name }} ({{ version }}){% endfor %}
+{%- endif -%}
 {%- if extra_versions -%}
 {% for name, version in extra_versions.items() %}
 {{ name }} ({{ version }}){% endfor %}

From b84b84b394862b7ce7682abe50ab56dd464d5bc9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= 
Date: Sat, 22 Jan 2022 14:55:25 +0100
Subject: [PATCH 2/9] Add check for a missing `make extract_translations`

Forgetting to run that causes weblate (or other translation tools) to
show outdated strings and not import new strings, which is bad for the
collaboration.

Fixes #118.
---
 .github/workflows/main.yaml | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index b2c1060..dbaea9a 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -50,6 +50,29 @@ jobs:
         run: |
           python -m flake8 snikket_web
 
+  translation-check:
+    runs-on: ubuntu-latest
+
+    name: 'lint: i18n'
+
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-python@v2
+        with:
+          python-version: '3.9'
+      - name: Install
+        run: |
+          set -euo pipefail
+          pip install flask-babel
+      - name: Linting
+        run: |
+          sed -ri '/^"POT-Creation-Date: /d' snikket_web/translations/messages.pot
+          git add snikket_web/translations/messages.pot
+          make extract_translations
+          sed -ri '/^"POT-Creation-Date: /d' snikket_web/translations/messages.pot
+          git diff --exit-code --color -- snikket_web/translations/messages.pot
+
+
   build:
     runs-on: ubuntu-latest
 

From a1ecb4ce80c6e90a94ab34ba8ff2e4f0b96f1685 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= 
Date: Sat, 22 Jan 2022 15:17:48 +0100
Subject: [PATCH 3/9] Port to WTForms 3.x

Fixes #103.
---
 requirements.txt     | 2 +-
 snikket_web/admin.py | 1 -
 snikket_web/main.py  | 2 +-
 snikket_web/user.py  | 2 +-
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/requirements.txt b/requirements.txt
index f4c81ec..0bd9187 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,5 +5,5 @@ hsluv~=0.0.2
 flask-babel~=1.0
 email-validator~=1.1
 environ-config~=20.0
-wtforms~=2.3
+wtforms~=3.0
 typing-extensions
diff --git a/snikket_web/admin.py b/snikket_web/admin.py
index 94c9b81..d15320e 100644
--- a/snikket_web/admin.py
+++ b/snikket_web/admin.py
@@ -10,7 +10,6 @@ import aiohttp
 import quart.flask_patch
 
 import wtforms
-import wtforms.fields.html5
 
 from quart import (
     Blueprint,
diff --git a/snikket_web/main.py b/snikket_web/main.py
index a3db81d..532e186 100644
--- a/snikket_web/main.py
+++ b/snikket_web/main.py
@@ -32,7 +32,7 @@ bp = quart.Blueprint("main", __name__)
 
 
 class LoginForm(BaseForm):
-    address = wtforms.TextField(
+    address = wtforms.StringField(
         _l("Address"),
         validators=[wtforms.validators.InputRequired()],
     )
diff --git a/snikket_web/user.py b/snikket_web/user.py
index 4b238fa..db8393a 100644
--- a/snikket_web/user.py
+++ b/snikket_web/user.py
@@ -59,7 +59,7 @@ _ACCESS_MODEL_CHOICES = [
 
 
 class ProfileForm(BaseForm):
-    nickname = wtforms.TextField(
+    nickname = wtforms.StringField(
         _l("Display name"),
     )
 

From 20abe4b9036823ec8faeffeabc601fc287aa54dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= 
Date: Sat, 22 Jan 2022 15:02:06 +0100
Subject: [PATCH 4/9] Add Vary: Accept-Language to all pages using that
 information

It was found during testing that some user agents cache aggressively
even between switches of the UI language. To properly indicate that the
pages actually depend on that information, we add the correct Vary
header.

Fixes #106.
---
 snikket_web/infra.py | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/snikket_web/infra.py b/snikket_web/infra.py
index c5e9ef0..890c160 100644
--- a/snikket_web/infra.py
+++ b/snikket_web/infra.py
@@ -8,6 +8,7 @@ import quart.flask_patch  # noqa:F401
 from quart import (
     current_app,
     request,
+    g,
 )
 
 import flask_babel
@@ -34,6 +35,9 @@ BYTE_UNIT_SCALE_MAP = [
 
 @babel.localeselector  # type:ignore
 def selected_locale() -> str:
+    # Needs mypy ignore because this is a free-for-all object and has no
+    # publicly known attributes.
+    g.language_header_accessed = True  # type: ignore
     selected = request.accept_languages.best_match(
         current_app.config['LANGUAGES']
     ) or current_app.config['LANGUAGES'][0]
@@ -68,6 +72,12 @@ def format_bytes(n: float) -> str:
     return "{} {}".format(n, unit)
 
 
+def add_vary_language_header(resp: quart.Response) -> quart.Response:
+    if getattr(g, "language_header_accessed", False):
+        resp.vary.add("Accept-Language")
+    return resp
+
+
 def init_templating(app: quart.Quart) -> None:
     app.template_filter("repr")(repr)
     app.template_filter("format_datetime")(flask_babel.format_datetime)
@@ -78,6 +88,7 @@ def init_templating(app: quart.Quart) -> None:
     app.template_filter("format_bytes")(format_bytes)
     app.template_filter("flatten")(flatten)
     app.template_filter("circle_name")(circle_name)
+    app.after_request(add_vary_language_header)
 
 
 def generate_error_id() -> str:

From a99834880415a826d255583bbb820359a0f55d5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= 
Date: Tue, 9 Nov 2021 17:59:49 +0100
Subject: [PATCH 5/9] Make hypercorn log to stdout in Docker

This may help with debugging issues, because we now actually see
incoming requests also on the hypercorn layer.

Fixes #97.
---
 docker/entrypoint.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
index 5aeb33d..8fcae91 100644
--- a/docker/entrypoint.sh
+++ b/docker/entrypoint.sh
@@ -5,4 +5,4 @@ export SNIKKET_WEB_DOMAIN="$SNIKKET_DOMAIN"
 export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE-127.0.0.1}"
 export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT-5765}"
 
-exec hypercorn -b "${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE}:${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT}" 'snikket_web:create_app()'
+exec hypercorn -b "${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE}:${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT}" --access-logfile=- --log-file=- 'snikket_web:create_app()'

From 73fda3d623c9aae5e73a1984464f204ca2b12bda Mon Sep 17 00:00:00 2001
From: Kim Alvefur 
Date: Sat, 19 Feb 2022 16:28:38 +0100
Subject: [PATCH 6/9] Add a Back button from export panel for consistency

The other user related sections all have a Back button so it makes sense
that this one ought to have one as well.
---
 snikket_web/templates/user_manage_data.html | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/snikket_web/templates/user_manage_data.html b/snikket_web/templates/user_manage_data.html
index 0f958e8..8fcb9e6 100644
--- a/snikket_web/templates/user_manage_data.html
+++ b/snikket_web/templates/user_manage_data.html
@@ -11,6 +11,8 @@
 			{% call render_errors(form) %}{% endcall %}
 
 			
+ {%- call standard_button("back", url_for('.index'), class="tertiary") %}{% trans %}Back{% endtrans %}{% endcall -%} +
{{ form.csrf_token }} {%- call form_button("download", form.action_export, class="primary") %}{% endcall -%} From eb226883024c61844a29a0be5b0bcb4c2af814e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= Date: Sun, 15 May 2022 14:11:24 +0200 Subject: [PATCH 7/9] Use english as default language instead of danish It is more likely that a user for whose language no translation exists can read english than danish. The fallback to english was apparently introduced in c58ce845, though it is possible that `best_match` did that internally before. Fixes #131. --- snikket_web/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/snikket_web/__init__.py b/snikket_web/__init__.py index 5ba3b78..bb651a2 100644 --- a/snikket_web/__init__.py +++ b/snikket_web/__init__.py @@ -145,9 +145,13 @@ class AppConfig: site_name = environ.var("") avatar_cache_ttl = environ.var(1800, converter=int) languages = environ.var([ + # Keep `en` as the first language, because it is used as a fallback + # if the language negotiation cannot find another match. It is more + # likely that users are able to read english (or find a suitable + # online translator) than, for instance, danish. + "en", "da", "de", - "en", "fr", "id", "it", From 03ca7ac5bba8146cb8a76b4ddf5e2bd4d1881042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= Date: Mon, 30 May 2022 20:51:37 +0200 Subject: [PATCH 8/9] Unbreak translation text extraction It was broken because of the same jinja2 update (presumably) which prompted 68f72743c5ee10d23cceae2512e8746a2e9d1b74. --- babel.cfg | 1 - snikket_web/translations/messages.pot | 134 +++++++++++++------------- 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/babel.cfg b/babel.cfg index d82fb6e..4a6f19b 100644 --- a/babel.cfg +++ b/babel.cfg @@ -1,4 +1,3 @@ [python: snikket_web/**.py] [jinja2: snikket_web/templates/**.html] [jinja2: snikket_web/templates/**.j2] -extensions=jinja2.ext.autoescape,jinja2.ext.with_ diff --git a/snikket_web/translations/messages.pot b/snikket_web/translations/messages.pot index 3589ae5..d14cc27 100644 --- a/snikket_web/translations/messages.pot +++ b/snikket_web/translations/messages.pot @@ -8,204 +8,204 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-01-17 17:27+0100\n" +"POT-Creation-Date: 2022-05-30 20:51+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.1\n" +"Generated-By: Babel 2.10.1\n" -#: snikket_web/admin.py:68 snikket_web/templates/admin_delete_user.html:10 +#: snikket_web/admin.py:70 snikket_web/templates/admin_delete_user.html:10 #: snikket_web/templates/admin_edit_circle.html:59 #: snikket_web/templates/admin_users.html:8 msgid "Login name" msgstr "" -#: snikket_web/admin.py:72 snikket_web/templates/admin_delete_user.html:12 +#: snikket_web/admin.py:74 snikket_web/templates/admin_delete_user.html:12 #: snikket_web/templates/admin_edit_circle.html:60 #: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63 msgid "Display name" msgstr "" -#: snikket_web/admin.py:76 snikket_web/templates/admin_edit_user.html:32 +#: snikket_web/admin.py:78 snikket_web/templates/admin_edit_user.html:32 msgid "Access Level" msgstr "" -#: snikket_web/admin.py:78 +#: snikket_web/admin.py:80 msgid "Limited" msgstr "" -#: snikket_web/admin.py:79 +#: snikket_web/admin.py:81 msgid "Normal user" msgstr "" -#: snikket_web/admin.py:80 +#: snikket_web/admin.py:82 msgid "Administrator" msgstr "" -#: snikket_web/admin.py:85 +#: snikket_web/admin.py:87 msgid "Update user" msgstr "" -#: snikket_web/admin.py:89 +#: snikket_web/admin.py:91 msgid "Create password reset link" msgstr "" -#: snikket_web/admin.py:107 +#: snikket_web/admin.py:109 msgid "Password reset link created" msgstr "" -#: snikket_web/admin.py:122 +#: snikket_web/admin.py:124 msgid "User information updated." msgstr "" -#: snikket_web/admin.py:144 +#: snikket_web/admin.py:146 msgid "Delete user permanently" msgstr "" -#: snikket_web/admin.py:157 +#: snikket_web/admin.py:159 msgid "User deleted" msgstr "" -#: snikket_web/admin.py:195 +#: snikket_web/admin.py:197 msgid "Password reset link not found" msgstr "" -#: snikket_web/admin.py:207 +#: snikket_web/admin.py:209 msgid "Password reset link deleted" msgstr "" -#: snikket_web/admin.py:227 +#: snikket_web/admin.py:229 msgid "Invite to circle" msgstr "" -#: snikket_web/admin.py:233 +#: snikket_web/admin.py:235 msgid "At least one circle must be selected" msgstr "" -#: snikket_web/admin.py:238 +#: snikket_web/admin.py:240 msgid "Valid for" msgstr "" -#: snikket_web/admin.py:240 +#: snikket_web/admin.py:242 msgid "One hour" msgstr "" -#: snikket_web/admin.py:241 +#: snikket_web/admin.py:243 msgid "Twelve hours" msgstr "" -#: snikket_web/admin.py:242 +#: snikket_web/admin.py:244 msgid "One day" msgstr "" -#: snikket_web/admin.py:243 +#: snikket_web/admin.py:245 msgid "One week" msgstr "" -#: snikket_web/admin.py:244 +#: snikket_web/admin.py:246 msgid "Four weeks" msgstr "" -#: snikket_web/admin.py:250 snikket_web/templates/admin_edit_invite.html:17 +#: snikket_web/admin.py:252 snikket_web/templates/admin_edit_invite.html:17 msgid "Invitation type" msgstr "" -#: snikket_web/admin.py:252 snikket_web/templates/library.j2:116 +#: snikket_web/admin.py:254 snikket_web/templates/library.j2:116 msgid "Individual" msgstr "" -#: snikket_web/admin.py:253 snikket_web/templates/library.j2:114 +#: snikket_web/admin.py:255 snikket_web/templates/library.j2:114 msgid "Group" msgstr "" -#: snikket_web/admin.py:259 +#: snikket_web/admin.py:261 msgid "New invitation link" msgstr "" -#: snikket_web/admin.py:321 +#: snikket_web/admin.py:323 msgid "Revoke" msgstr "" -#: snikket_web/admin.py:345 +#: snikket_web/admin.py:347 msgid "Invitation created" msgstr "" -#: snikket_web/admin.py:361 +#: snikket_web/admin.py:363 msgid "No such invitation exists" msgstr "" -#: snikket_web/admin.py:376 +#: snikket_web/admin.py:378 msgid "Invitation revoked" msgstr "" -#: snikket_web/admin.py:393 snikket_web/admin.py:441 +#: snikket_web/admin.py:395 snikket_web/admin.py:443 msgid "Name" msgstr "" -#: snikket_web/admin.py:398 snikket_web/templates/admin_circles.html:47 +#: snikket_web/admin.py:400 snikket_web/templates/admin_circles.html:47 msgid "Create circle" msgstr "" -#: snikket_web/admin.py:428 +#: snikket_web/admin.py:430 msgid "Circle created" msgstr "" -#: snikket_web/admin.py:446 +#: snikket_web/admin.py:448 msgid "Select user" msgstr "" -#: snikket_web/admin.py:451 +#: snikket_web/admin.py:453 msgid "Update circle" msgstr "" -#: snikket_web/admin.py:455 +#: snikket_web/admin.py:457 msgid "Delete circle permanently" msgstr "" -#: snikket_web/admin.py:461 +#: snikket_web/admin.py:463 msgid "Add user" msgstr "" -#: snikket_web/admin.py:477 +#: snikket_web/admin.py:479 msgid "No such circle exists" msgstr "" -#: snikket_web/admin.py:514 +#: snikket_web/admin.py:516 msgid "Circle data updated" msgstr "" -#: snikket_web/admin.py:520 +#: snikket_web/admin.py:522 msgid "Circle deleted" msgstr "" -#: snikket_web/admin.py:531 +#: snikket_web/admin.py:533 msgid "User added to circle" msgstr "" -#: snikket_web/admin.py:540 +#: snikket_web/admin.py:542 msgid "User removed from circle" msgstr "" -#: snikket_web/admin.py:609 +#: snikket_web/admin.py:611 msgid "Message contents" msgstr "" -#: snikket_web/admin.py:615 +#: snikket_web/admin.py:617 msgid "Only send to online users" msgstr "" -#: snikket_web/admin.py:619 +#: snikket_web/admin.py:621 msgid "Post to all users" msgstr "" -#: snikket_web/admin.py:623 +#: snikket_web/admin.py:625 msgid "Send preview to yourself" msgstr "" -#: snikket_web/admin.py:645 +#: snikket_web/admin.py:647 msgid "Announcement sent!" msgstr "" @@ -213,82 +213,82 @@ msgstr "" msgid "Main" msgstr "" -#: snikket_web/invite.py:33 +#: snikket_web/invite.py:35 msgid "" "The account data you tried to import is too large to upload. Please " "contact your Snikket operator." msgstr "" -#: snikket_web/invite.py:112 +#: snikket_web/invite.py:114 msgid "Username" msgstr "" -#: snikket_web/invite.py:116 snikket_web/invite.py:184 snikket_web/main.py:41 +#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43 msgid "Password" msgstr "" -#: snikket_web/invite.py:120 snikket_web/invite.py:188 +#: snikket_web/invite.py:122 snikket_web/invite.py:190 msgid "Confirm password" msgstr "" -#: snikket_web/invite.py:124 snikket_web/invite.py:192 +#: snikket_web/invite.py:126 snikket_web/invite.py:194 msgid "The passwords must match." msgstr "" -#: snikket_web/invite.py:129 +#: snikket_web/invite.py:131 msgid "Create account" msgstr "" -#: snikket_web/invite.py:156 +#: snikket_web/invite.py:158 msgid "That username is already taken." msgstr "" -#: snikket_web/invite.py:160 snikket_web/invite.py:225 +#: snikket_web/invite.py:162 snikket_web/invite.py:227 msgid "Registration was declined for unknown reasons." msgstr "" -#: snikket_web/invite.py:164 +#: snikket_web/invite.py:166 msgid "The username is not valid." msgstr "" -#: snikket_web/invite.py:197 snikket_web/templates/user_home.html:32 +#: snikket_web/invite.py:199 snikket_web/templates/user_home.html:32 #: snikket_web/templates/user_passwd.html:29 msgid "Change password" msgstr "" -#: snikket_web/invite.py:244 +#: snikket_web/invite.py:246 msgid "Account data file" msgstr "" -#: snikket_web/invite.py:248 +#: snikket_web/invite.py:250 msgid "Import data" msgstr "" -#: snikket_web/invite.py:269 +#: snikket_web/invite.py:271 #, python-format msgid "" "The account data you tried to import is in an unknown format. Please " "upload an XML file in XEP-0227 format (provided format: %(mimetype)s)." msgstr "" -#: snikket_web/invite.py:289 snikket_web/templates/unauth.html:18 +#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18 #: snikket_web/user.py:178 msgid "Error" msgstr "" -#: snikket_web/main.py:36 +#: snikket_web/main.py:38 msgid "Address" msgstr "" -#: snikket_web/main.py:46 +#: snikket_web/main.py:48 msgid "Sign in" msgstr "" -#: snikket_web/main.py:55 +#: snikket_web/main.py:57 msgid "Invalid username or password." msgstr "" -#: snikket_web/main.py:83 +#: snikket_web/main.py:85 msgid "Login successful!" msgstr "" From f2c79044e087026a0438d386aab7882255ed5c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= Date: Mon, 6 Jun 2022 19:48:56 +0200 Subject: [PATCH 9/9] Clean up post-merge lint I am a *bit* sorry for this commit, because ideally this would've been folded into 6d50b1c2c7e5dca615e341f41c88d89487b2e393 and whatever the source of the other "conflict" was. However, as the things have been merged in a batch, I can't do much more than this. --- snikket_web/infra.py | 4 +- snikket_web/main.py | 2 +- snikket_web/translations/messages.pot | 101 +++++++++++++------------- 3 files changed, 53 insertions(+), 54 deletions(-) diff --git a/snikket_web/infra.py b/snikket_web/infra.py index 890c160..12ce581 100644 --- a/snikket_web/infra.py +++ b/snikket_web/infra.py @@ -35,9 +35,7 @@ BYTE_UNIT_SCALE_MAP = [ @babel.localeselector # type:ignore def selected_locale() -> str: - # Needs mypy ignore because this is a free-for-all object and has no - # publicly known attributes. - g.language_header_accessed = True # type: ignore + g.language_header_accessed = True selected = request.accept_languages.best_match( current_app.config['LANGUAGES'] ) or current_app.config['LANGUAGES'][0] diff --git a/snikket_web/main.py b/snikket_web/main.py index 502adbf..286ee1d 100644 --- a/snikket_web/main.py +++ b/snikket_web/main.py @@ -99,7 +99,7 @@ async def about() -> str: version = _version.version try: core_versions["Prosody"] = await client.get_server_version() - except quart.exceptions.Unauthorized: + except werkzeug.exceptions.Unauthorized: core_versions["Prosody"] = "unknown" if current_app.debug: diff --git a/snikket_web/translations/messages.pot b/snikket_web/translations/messages.pot index d14cc27..d8ff848 100644 --- a/snikket_web/translations/messages.pot +++ b/snikket_web/translations/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-05-30 20:51+0200\n" +"POT-Creation-Date: 2022-06-06 19:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,199 +17,199 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.10.1\n" -#: snikket_web/admin.py:70 snikket_web/templates/admin_delete_user.html:10 +#: snikket_web/admin.py:69 snikket_web/templates/admin_delete_user.html:10 #: snikket_web/templates/admin_edit_circle.html:59 #: snikket_web/templates/admin_users.html:8 msgid "Login name" msgstr "" -#: snikket_web/admin.py:74 snikket_web/templates/admin_delete_user.html:12 +#: snikket_web/admin.py:73 snikket_web/templates/admin_delete_user.html:12 #: snikket_web/templates/admin_edit_circle.html:60 #: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63 msgid "Display name" msgstr "" -#: snikket_web/admin.py:78 snikket_web/templates/admin_edit_user.html:32 +#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32 msgid "Access Level" msgstr "" -#: snikket_web/admin.py:80 +#: snikket_web/admin.py:79 msgid "Limited" msgstr "" -#: snikket_web/admin.py:81 +#: snikket_web/admin.py:80 msgid "Normal user" msgstr "" -#: snikket_web/admin.py:82 +#: snikket_web/admin.py:81 msgid "Administrator" msgstr "" -#: snikket_web/admin.py:87 +#: snikket_web/admin.py:86 msgid "Update user" msgstr "" -#: snikket_web/admin.py:91 +#: snikket_web/admin.py:90 msgid "Create password reset link" msgstr "" -#: snikket_web/admin.py:109 +#: snikket_web/admin.py:108 msgid "Password reset link created" msgstr "" -#: snikket_web/admin.py:124 +#: snikket_web/admin.py:123 msgid "User information updated." msgstr "" -#: snikket_web/admin.py:146 +#: snikket_web/admin.py:145 msgid "Delete user permanently" msgstr "" -#: snikket_web/admin.py:159 +#: snikket_web/admin.py:158 msgid "User deleted" msgstr "" -#: snikket_web/admin.py:197 +#: snikket_web/admin.py:196 msgid "Password reset link not found" msgstr "" -#: snikket_web/admin.py:209 +#: snikket_web/admin.py:208 msgid "Password reset link deleted" msgstr "" -#: snikket_web/admin.py:229 +#: snikket_web/admin.py:228 msgid "Invite to circle" msgstr "" -#: snikket_web/admin.py:235 +#: snikket_web/admin.py:234 msgid "At least one circle must be selected" msgstr "" -#: snikket_web/admin.py:240 +#: snikket_web/admin.py:239 msgid "Valid for" msgstr "" -#: snikket_web/admin.py:242 +#: snikket_web/admin.py:241 msgid "One hour" msgstr "" -#: snikket_web/admin.py:243 +#: snikket_web/admin.py:242 msgid "Twelve hours" msgstr "" -#: snikket_web/admin.py:244 +#: snikket_web/admin.py:243 msgid "One day" msgstr "" -#: snikket_web/admin.py:245 +#: snikket_web/admin.py:244 msgid "One week" msgstr "" -#: snikket_web/admin.py:246 +#: snikket_web/admin.py:245 msgid "Four weeks" msgstr "" -#: snikket_web/admin.py:252 snikket_web/templates/admin_edit_invite.html:17 +#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17 msgid "Invitation type" msgstr "" -#: snikket_web/admin.py:254 snikket_web/templates/library.j2:116 +#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116 msgid "Individual" msgstr "" -#: snikket_web/admin.py:255 snikket_web/templates/library.j2:114 +#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114 msgid "Group" msgstr "" -#: snikket_web/admin.py:261 +#: snikket_web/admin.py:260 msgid "New invitation link" msgstr "" -#: snikket_web/admin.py:323 +#: snikket_web/admin.py:322 msgid "Revoke" msgstr "" -#: snikket_web/admin.py:347 +#: snikket_web/admin.py:346 msgid "Invitation created" msgstr "" -#: snikket_web/admin.py:363 +#: snikket_web/admin.py:362 msgid "No such invitation exists" msgstr "" -#: snikket_web/admin.py:378 +#: snikket_web/admin.py:377 msgid "Invitation revoked" msgstr "" -#: snikket_web/admin.py:395 snikket_web/admin.py:443 +#: snikket_web/admin.py:394 snikket_web/admin.py:442 msgid "Name" msgstr "" -#: snikket_web/admin.py:400 snikket_web/templates/admin_circles.html:47 +#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47 msgid "Create circle" msgstr "" -#: snikket_web/admin.py:430 +#: snikket_web/admin.py:429 msgid "Circle created" msgstr "" -#: snikket_web/admin.py:448 +#: snikket_web/admin.py:447 msgid "Select user" msgstr "" -#: snikket_web/admin.py:453 +#: snikket_web/admin.py:452 msgid "Update circle" msgstr "" -#: snikket_web/admin.py:457 +#: snikket_web/admin.py:456 msgid "Delete circle permanently" msgstr "" -#: snikket_web/admin.py:463 +#: snikket_web/admin.py:462 msgid "Add user" msgstr "" -#: snikket_web/admin.py:479 +#: snikket_web/admin.py:478 msgid "No such circle exists" msgstr "" -#: snikket_web/admin.py:516 +#: snikket_web/admin.py:515 msgid "Circle data updated" msgstr "" -#: snikket_web/admin.py:522 +#: snikket_web/admin.py:521 msgid "Circle deleted" msgstr "" -#: snikket_web/admin.py:533 +#: snikket_web/admin.py:532 msgid "User added to circle" msgstr "" -#: snikket_web/admin.py:542 +#: snikket_web/admin.py:541 msgid "User removed from circle" msgstr "" -#: snikket_web/admin.py:611 +#: snikket_web/admin.py:610 msgid "Message contents" msgstr "" -#: snikket_web/admin.py:617 +#: snikket_web/admin.py:616 msgid "Only send to online users" msgstr "" -#: snikket_web/admin.py:621 +#: snikket_web/admin.py:620 msgid "Post to all users" msgstr "" -#: snikket_web/admin.py:625 +#: snikket_web/admin.py:624 msgid "Send preview to yourself" msgstr "" -#: snikket_web/admin.py:647 +#: snikket_web/admin.py:646 msgid "Announcement sent!" msgstr "" -#: snikket_web/infra.py:51 +#: snikket_web/infra.py:53 msgid "Main" msgstr "" @@ -445,7 +445,7 @@ msgstr "" msgid "Software Versions" msgstr "" -#: snikket_web/templates/about.html:29 +#: snikket_web/templates/about.html:32 msgid "Back to the main page" msgstr "" @@ -580,6 +580,7 @@ msgstr "" #: snikket_web/templates/admin_delete_user.html:19 #: snikket_web/templates/admin_reset_user_password.html:25 #: snikket_web/templates/user_logout.html:10 +#: snikket_web/templates/user_manage_data.html:14 #: snikket_web/templates/user_passwd.html:27 #: snikket_web/templates/user_profile.html:32 msgid "Back"