Compare commits

..

1 Commits

Author SHA1 Message Date
Jonas Schäfer
a1ecb4ce80 Port to WTForms 3.x
Fixes #103.
2022-01-22 15:17:48 +01:00
12 changed files with 48 additions and 1618 deletions

View File

@@ -6,7 +6,8 @@ RUN set -eu; \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
python3 python3-pip python3-setuptools python3-wheel \ python3 python3-pip python3-setuptools python3-wheel \
libpython3-dev \ libpython3-dev \
make build-essential; make build-essential \
netcat;
COPY requirements.txt /opt/snikket-web-portal/requirements.txt COPY requirements.txt /opt/snikket-web-portal/requirements.txt
COPY build-requirements.txt /opt/snikket-web-portal/build-requirements.txt COPY build-requirements.txt /opt/snikket-web-portal/build-requirements.txt
@@ -16,8 +17,7 @@ COPY babel.cfg /opt/snikket-web-portal/babel.cfg
WORKDIR /opt/snikket-web-portal WORKDIR /opt/snikket-web-portal
RUN set -eu; \ RUN pip3 install -r requirements.txt; \
pip3 install -r requirements.txt; \
pip3 install -r build-requirements.txt; \ pip3 install -r build-requirements.txt; \
make; make;
@@ -33,22 +33,21 @@ ENV SNIKKET_WEB_PYENV=/etc/snikket-web-portal/env.py
ENV SNIKKET_WEB_PROSODY_ENDPOINT=http://127.0.0.1:5280/ ENV SNIKKET_WEB_PROSODY_ENDPOINT=http://127.0.0.1:5280/
COPY requirements.txt /opt/snikket-web-portal/requirements.txt HEALTHCHECK CMD nc -zv ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE:-127.0.0.1} ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT:-5765}
WORKDIR /opt/snikket-web-portal
RUN set -eu; \ RUN set -eu; \
export DEBIAN_FRONTEND=noninteractive ; \ export DEBIAN_FRONTEND=noninteractive ; \
apt-get update ; \ apt-get update ; \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
python3 python3-pip python3-setuptools python3-wheel build-essential libpython3-dev netcat; \ python3 python3-pip python3-setuptools python3-wheel; \
pip3 install -r requirements.txt; \
apt-get remove -y --autoremove build-essential libpython3-dev; \
apt-get clean ; rm -rf /var/lib/apt/lists; \ apt-get clean ; rm -rf /var/lib/apt/lists; \
pip3 install hypercorn; \ pip3 install hypercorn; \
rm -rf /root/.cache; rm -rf /root/.cache;
HEALTHCHECK CMD nc -zv ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE:-127.0.0.1} ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT:-5765} WORKDIR /opt/snikket-web-portal
COPY requirements.txt /opt/snikket-web-portal/requirements.txt
RUN pip3 install -r requirements.txt; rm -rf /root/.cache;
COPY --from=build /opt/snikket-web-portal/snikket_web/ /opt/snikket-web-portal/snikket_web COPY --from=build /opt/snikket-web-portal/snikket_web/ /opt/snikket-web-portal/snikket_web
COPY babel.cfg /opt/snikket-web-portal/babel.cfg COPY babel.cfg /opt/snikket-web-portal/babel.cfg

View File

@@ -5,5 +5,5 @@ hsluv~=0.0.2
flask-babel~=1.0 flask-babel~=1.0
email-validator~=1.1 email-validator~=1.1
environ-config~=20.0 environ-config~=20.0
wtforms~=2.3 wtforms~=3.0
typing-extensions typing-extensions

View File

@@ -145,19 +145,14 @@ class AppConfig:
site_name = environ.var("") site_name = environ.var("")
avatar_cache_ttl = environ.var(1800, converter=int) avatar_cache_ttl = environ.var(1800, converter=int)
languages = environ.var([ 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", "da",
"de", "de",
"en",
"fr", "fr",
"id", "id",
"it", "it",
"pl", "pl",
"sv", "sv",
"zh_Hans_CN",
], converter=autosplit) ], converter=autosplit)
apple_store_url = environ.var( apple_store_url = environ.var(
"https://apps.apple.com/us/app/snikket/id1545164189", "https://apps.apple.com/us/app/snikket/id1545164189",

View File

@@ -10,7 +10,6 @@ import aiohttp
import quart.flask_patch import quart.flask_patch
import wtforms import wtforms
import wtforms.fields.html5
from quart import ( from quart import (
Blueprint, Blueprint,

View File

@@ -32,7 +32,7 @@ bp = quart.Blueprint("main", __name__)
class LoginForm(BaseForm): class LoginForm(BaseForm):
address = wtforms.TextField( address = wtforms.StringField(
_l("Address"), _l("Address"),
validators=[wtforms.validators.InputRequired()], validators=[wtforms.validators.InputRequired()],
) )

View File

@@ -28,12 +28,12 @@
</div> </div>
<div class="f-ebox"> <div class="f-ebox">
{{ form.password.label }} {{ form.password.label }}
{{ form.password(autocomplete="new-password") }} {{ form.password }}
<p class="field-desc weak">{% trans %}Enter a secure password that you do not use anywhere else.{% endtrans %}</p> <p class="field-desc weak">{% trans %}Enter a secure password that you do not use anywhere else.{% endtrans %}</p>
</div> </div>
<div class="f-ebox"> <div class="f-ebox">
{{ form.password_confirm.label }} {{ form.password_confirm.label }}
{{ form.password_confirm(autocomplete="new-password") }} {{ form.password_confirm }}
</div> </div>
<div class="f-bbox"> <div class="f-bbox">
{%- call form_button("done", form.action_register, class="primary") -%}{%- endcall -%} {%- call form_button("done", form.action_register, class="primary") -%}{%- endcall -%}

View File

@@ -17,11 +17,11 @@
{%- call render_errors(form) %}{% endcall -%} {%- call render_errors(form) %}{% endcall -%}
<div class="f-ebox"> <div class="f-ebox">
{{ form.password.label }} {{ form.password.label }}
{{ form.password(autocomplete="new-password") }} {{ form.password }}
</div> </div>
<div class="f-ebox"> <div class="f-ebox">
{{ form.password_confirm.label }} {{ form.password_confirm.label }}
{{ form.password_confirm(autocomplete="new-password") }} {{ form.password_confirm }}
</div> </div>
<div class="f-bbox"> <div class="f-bbox">
{%- call form_button("passwd", form.action_reset, class="primary") -%}{%- endcall -%} {%- call form_button("passwd", form.action_reset, class="primary") -%}{%- endcall -%}

View File

@@ -9,15 +9,15 @@
{%- endcall -%} {%- endcall -%}
<div class="f-ebox"> <div class="f-ebox">
{{ form.current_password.label(class="required") }} {{ form.current_password.label(class="required") }}
{{ form.current_password(class=("has-error" if form.current_password.name in form.errors else ""), autocomplete="current-password") }} {{ form.current_password(class=("has-error" if form.current_password.name in form.errors else "")) }}
</div> </div>
<div class="f-ebox"> <div class="f-ebox">
{{ form.new_password.label(class="required") }} {{ form.new_password.label(class="required") }}
{{ form.new_password(autocomplete="new-password") }} {{ form.new_password }}
</div> </div>
<div class="f-ebox"> <div class="f-ebox">
{{ form.new_password_confirm.label(class="required") }} {{ form.new_password_confirm.label(class="required") }}
{{ form.new_password_confirm(class=("has-error" if form.new_password_confirm.name in form.errors else ""), autocomplete="new-password") }} {{ form.new_password_confirm(class=("has-error" if form.new_password_confirm.name in form.errors else "")) }}
</div> </div>
<div class="box warning"> <div class="box warning">
<header>{% trans %}Warning{% endtrans %}</header> <header>{% trans %}Warning{% endtrans %}</header>

View File

@@ -6,18 +6,18 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-17 17:27+0100\n" "POT-Creation-Date: 2022-01-17 17:27+0100\n"
"PO-Revision-Date: 2022-04-11 13:00+0000\n" "PO-Revision-Date: 2021-06-19 15:01+0000\n"
"Last-Translator: David Baraniak <admin@chipmnk.dev>\n" "Last-Translator: Link Mauve <linkmauve@linkmauve.fr>\n"
"Language-Team: French <http://i18n.sotecware.net/projects/snikket/web-portal/" "Language-Team: French <https://i18n.sotecware.net/projects/snikket/web-"
"fr/>\n" "portal/fr/>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.8.1\n" "X-Generator: Weblate 4.5.1\n"
"Generated-By: Babel 2.9.0\n" "Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:68 snikket_web/templates/admin_delete_user.html:10 #: snikket_web/admin.py:68 snikket_web/templates/admin_delete_user.html:10
@@ -221,8 +221,6 @@ msgid ""
"The account data you tried to import is too large to upload. Please contact " "The account data you tried to import is too large to upload. Please contact "
"your Snikket operator." "your Snikket operator."
msgstr "" msgstr ""
"Les données du compte que vous avez essayé d'importer sont trop volumineuses "
"pour être téléchargées. Veuillez contacter votre opérateur Snikket."
#: snikket_web/invite.py:112 #: snikket_web/invite.py:112
msgid "Username" msgid "Username"
@@ -263,11 +261,11 @@ msgstr "Changer de mot de passe"
#: snikket_web/invite.py:244 #: snikket_web/invite.py:244
msgid "Account data file" msgid "Account data file"
msgstr "Fichier de données du compte" msgstr ""
#: snikket_web/invite.py:248 #: snikket_web/invite.py:248
msgid "Import data" msgid "Import data"
msgstr "Importer les données" msgstr ""
#: snikket_web/invite.py:269 #: snikket_web/invite.py:269
#, python-format #, python-format
@@ -275,9 +273,6 @@ msgid ""
"The account data you tried to import is in an unknown format. Please upload " "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)." "an XML file in XEP-0227 format (provided format: %(mimetype)s)."
msgstr "" msgstr ""
"Les données du compte que vous avez essayé d'importer sont dans un format "
"inconnu. Veuillez télécharger un fichier XML au format XEP-0227 (format "
"fourni : %(mimetype)s)."
#: snikket_web/invite.py:289 snikket_web/templates/unauth.html:18 #: snikket_web/invite.py:289 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178 #: snikket_web/user.py:178
@@ -346,11 +341,11 @@ msgstr "Mettre à jour le profil"
#: snikket_web/user.py:82 #: snikket_web/user.py:82
msgid "Account data" msgid "Account data"
msgstr "Données du compte" msgstr ""
#: snikket_web/user.py:86 #: snikket_web/user.py:86
msgid "Upload" msgid "Upload"
msgstr "Télécharger" msgstr ""
#: snikket_web/user.py:111 #: snikket_web/user.py:111
msgid "Incorrect password." msgid "Incorrect password."
@@ -374,11 +369,11 @@ msgstr "Profil mis à jour"
#: snikket_web/user.py:184 #: snikket_web/user.py:184
msgid "Export" msgid "Export"
msgstr "Exporter" msgstr ""
#: snikket_web/user.py:202 #: snikket_web/user.py:202
msgid "You currently have no account data to export." msgid "You currently have no account data to export."
msgstr "Vous n'avez actuellement aucune donnée de compte à exporter." msgstr ""
#: snikket_web/templates/_footer.html:4 #: snikket_web/templates/_footer.html:4
#, python-format #, python-format
@@ -1019,7 +1014,7 @@ msgstr "Statut du serveur Snikket"
#: snikket_web/templates/admin_system.html:71 #: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files" msgid "Storage used by shared files"
msgstr "Stockage utilisé par les fichiers partagés" msgstr ""
#: snikket_web/templates/admin_system.html:79 #: snikket_web/templates/admin_system.html:79
msgid "Connected devices" msgid "Connected devices"
@@ -1319,22 +1314,22 @@ msgid ""
"You can now safely close this page, or log in to the web portal to <a href=" "You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>." "\"%(login_url)s\">manage your account</a>."
msgstr "" msgstr ""
"Vous pouvez maintenant fermer cette page en toute sécurité, ou vous "
"connecter au portail web pour <a href=\"%(login_url)s\">gérer votre "
"compte</a>."
#: snikket_web/templates/invite_success.html:21 #: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Operation successful"
msgid "Import successful" msgid "Import successful"
msgstr "Importation réussie" msgstr "Opération réussie"
#: snikket_web/templates/invite_success.html:22 #: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported." msgid "Congratulations! Your account data has been successfully imported."
msgstr "" msgstr ""
"Félicitations ! Les données de votre compte ont été importées avec succès."
#: snikket_web/templates/invite_success.html:26 #: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "Using the Snikket app"
msgid "Moving to Snikket?" msgid "Moving to Snikket?"
msgstr "Nouveau utilisateur Snikket ?" msgstr "En utilisant lapplication Snikket"
#: snikket_web/templates/invite_success.html:27 #: snikket_web/templates/invite_success.html:27
msgid "" msgid ""
@@ -1343,15 +1338,10 @@ msgid ""
"information, etc.) from your previous account. When you have exported the " "information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below." "data from your previous account, upload it using the form below."
msgstr "" msgstr ""
"Si vous passez d'une autre instance de Snikket ou d'un autre service "
"compatible XMPP, vous pouvez éventuellement importer les données (contacts, "
"informations de profil, etc.) de votre ancien compte. Lorsque vous avez "
"exporté les données de votre ancien compte, téléchargez-les en utilisant le "
"formulaire ci-dessous."
#: snikket_web/templates/invite_success.html:30 #: snikket_web/templates/invite_success.html:30
msgid "Upload account data" msgid "Upload account data"
msgstr "Télécharger les données du compte" msgstr ""
#: snikket_web/templates/invite_view.html:6 #: snikket_web/templates/invite_view.html:6
#, python-format #, python-format
@@ -1406,9 +1396,10 @@ msgstr "Télécharger sur lApp Store"
#: snikket_web/templates/invite_view.html:32 #: snikket_web/templates/invite_view.html:32
msgid "Get it on F-Droid" msgid "Get it on F-Droid"
msgstr "Obtenez-le sur F-Droid" msgstr ""
#: snikket_web/templates/invite_view.html:35 #: snikket_web/templates/invite_view.html:35
#, fuzzy
msgid "Send to mobile device" msgid "Send to mobile device"
msgstr "Envoyer vers l'appareil" msgstr "Envoyer vers l'appareil"
@@ -1487,14 +1478,10 @@ msgid ""
"After downloading Snikket from the App Store, you have to return to this " "After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed." "invite link and tap on \"Open the app\" to proceed."
msgstr "" msgstr ""
"Après avoir téléchargé Snikket depuis l'App Store, vous devez revenir à ce "
"lien d'invitation et cliquer sur \"Ouvrir l'application\" pour continuer."
#: snikket_web/templates/invite_view.html:101 #: snikket_web/templates/invite_view.html:101
msgid "First download Snikket from the App Store using the button below:" msgid "First download Snikket from the App Store using the button below:"
msgstr "" msgstr ""
"Téléchargez d'abord Snikket depuis l'App Store en utilisant le bouton ci-"
"dessous :"
#: snikket_web/templates/invite_view.html:103 #: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131 #: snikket_web/templates/invite_view.html:131
@@ -1502,9 +1489,6 @@ msgid ""
"After the installation is complete, you can return to this page and tap the " "After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:" "\"Open the app\" button to continue with the setup:"
msgstr "" msgstr ""
"Une fois l'installation terminée, vous pouvez revenir à cette page et "
"appuyer sur le bouton \"Ouvrir l'application\" pour poursuivre la "
"configuration :"
#: snikket_web/templates/invite_view.html:121 #: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130 #: snikket_web/templates/invite_view.html:130
@@ -1516,13 +1500,10 @@ msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link " "After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed." "and tap on \"Open the app\" to proceed."
msgstr "" msgstr ""
"Après avoir installé Snikket via F-Droid, vous devez revenir à ce lien "
"d'invitation et appuyer sur \"Ouvrir l'application\" pour continuer."
#: snikket_web/templates/invite_view.html:129 #: snikket_web/templates/invite_view.html:129
msgid "First install Snikket from F-Droid using the button below:" msgid "First install Snikket from F-Droid using the button below:"
msgstr "" msgstr ""
"Installez d'abord Snikket depuis F-Droid en utilisant le bouton ci-dessous :"
#: snikket_web/templates/library.j2:18 #: snikket_web/templates/library.j2:18
msgid "Copy link" msgid "Copy link"
@@ -1589,8 +1570,10 @@ msgstr "Éditer votre profil"
#: snikket_web/templates/user_home.html:33 #: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4 #: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data" msgid "Manage your data"
msgstr "Gérer vos données" msgstr "Gérer les utilisateurs"
#: snikket_web/templates/user_home.html:39 #: snikket_web/templates/user_home.html:39
msgid "Your Snikket" msgid "Your Snikket"
@@ -1618,16 +1601,16 @@ msgstr ""
"autres appareils connectés." "autres appareils connectés."
#: snikket_web/templates/user_manage_data.html:8 #: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Your account"
msgid "Export account" msgid "Export account"
msgstr "Exportation du compte" msgstr "Votre compte"
#: snikket_web/templates/user_manage_data.html:9 #: snikket_web/templates/user_manage_data.html:9
msgid "" msgid ""
"Download your account data as a file for backup purposes or to move your " "Download your account data as a file for backup purposes or to move your "
"account to another service." "account to another service."
msgstr "" msgstr ""
"Téléchargez les données de votre compte sous forme d'un fichier à des fins "
"de sauvegarde ou pour transférer votre compte vers un autre service."
#: snikket_web/templates/user_passwd.html:5 #: snikket_web/templates/user_passwd.html:5
msgid "Change your password" msgid "Change your password"

File diff suppressed because it is too large Load Diff

View File

@@ -59,7 +59,7 @@ _ACCESS_MODEL_CHOICES = [
class ProfileForm(BaseForm): class ProfileForm(BaseForm):
nickname = wtforms.TextField( nickname = wtforms.StringField(
_l("Display name"), _l("Display name"),
) )