From 608cc8a92c339a9eb867c4102632cb0ee56d9597 Mon Sep 17 00:00:00 2001 From: kritzl Date: Tue, 13 Jun 2023 12:28:50 +0200 Subject: [PATCH 1/7] remove Jabber --- .env.dev | 1 - .env.test | 1 - Dockerfile | 3 +- README.md | 9 - locale/de_DE/LC_MESSAGES/django.po | 131 +------- locale/en_US/LC_MESSAGES/django.po | 122 +------ locale/fr_FR/LC_MESSAGES/django.po | 126 +------ mafiasi/base/templates/base/licenses.html | 2 +- .../base/templates/base/technical_info.html | 1 - mafiasi/jabber/__init__.py | 0 mafiasi/jabber/admin.py | 25 -- mafiasi/jabber/apps.py | 15 - mafiasi/jabber/dbrouter.py | 23 -- mafiasi/jabber/erlangparser.py | 34 -- mafiasi/jabber/migrations/0001_initial.py | 203 ------------ .../migrations/0002_auto_20150515_0237.py | 25 -- .../migrations/0003_auto_20161011_2104.py | 19 -- .../migrations/0004_alter_created_at.py | 22 -- mafiasi/jabber/migrations/__init__.py | 0 mafiasi/jabber/models.py | 310 ------------------ mafiasi/jabber/sql/srgroup.sql | 1 - mafiasi/jabber/sql/sruser.sql | 1 - mafiasi/jabber/static/css/jabber.css | 77 ----- .../jabber/static/img/conversations-en.png | Bin 44561 -> 0 bytes mafiasi/jabber/static/img/dino-en.png | Bin 13125 -> 0 bytes mafiasi/jabber/static/img/gajim-en.png | Bin 22369 -> 0 bytes mafiasi/jabber/static/img/pidgin-en.png | Bin 37125 -> 0 bytes mafiasi/jabber/static/js/jabber.js | 4 - mafiasi/jabber/templates/jabber/index.html | 99 ------ mafiasi/jabber/urls.py | 7 - mafiasi/jabber/views.py | 26 -- mafiasi/settings.py | 17 - 32 files changed, 8 insertions(+), 1296 deletions(-) delete mode 100644 mafiasi/jabber/__init__.py delete mode 100644 mafiasi/jabber/admin.py delete mode 100644 mafiasi/jabber/apps.py delete mode 100644 mafiasi/jabber/dbrouter.py delete mode 100644 mafiasi/jabber/erlangparser.py delete mode 100644 mafiasi/jabber/migrations/0001_initial.py delete mode 100644 mafiasi/jabber/migrations/0002_auto_20150515_0237.py delete mode 100644 mafiasi/jabber/migrations/0003_auto_20161011_2104.py delete mode 100644 mafiasi/jabber/migrations/0004_alter_created_at.py delete mode 100644 mafiasi/jabber/migrations/__init__.py delete mode 100644 mafiasi/jabber/models.py delete mode 100644 mafiasi/jabber/sql/srgroup.sql delete mode 100644 mafiasi/jabber/sql/sruser.sql delete mode 100644 mafiasi/jabber/static/css/jabber.css delete mode 100644 mafiasi/jabber/static/img/conversations-en.png delete mode 100644 mafiasi/jabber/static/img/dino-en.png delete mode 100644 mafiasi/jabber/static/img/gajim-en.png delete mode 100644 mafiasi/jabber/static/img/pidgin-en.png delete mode 100644 mafiasi/jabber/static/js/jabber.js delete mode 100644 mafiasi/jabber/templates/jabber/index.html delete mode 100644 mafiasi/jabber/urls.py delete mode 100644 mafiasi/jabber/views.py diff --git a/.env.dev b/.env.dev index 37b509b5..4c463ee3 100644 --- a/.env.dev +++ b/.env.dev @@ -1,5 +1,4 @@ MAFIASI_DEBUG=True -MAFIASI_ENABLE_JABBER_INTEGRATION=False MAFIASI_ENABLE_LDAP_AUTH_BACKEND=False MAFIASI_ENABLE_LDAP_REGISTRATION=False MAFIASI_ENABLE_EP_INTEGRATION=False diff --git a/.env.test b/.env.test index 2233b2c0..5f4fae38 100644 --- a/.env.test +++ b/.env.test @@ -1,6 +1,5 @@ MAFIASI_DEBUG=True MAFIASI_TESTING=True -MAFIASI_ENABLE_JABBER_INTEGRATION=False MAFIASI_ENABLE_LDAP_AUTH_BACKEND=False MAFIASI_ENABLE_LDAP_REGISTRATION=False MAFIASI_ENABLE_MUMBLE_INTEGRATION=False diff --git a/Dockerfile b/Dockerfile index 493bb6c2..193b4804 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,8 +26,7 @@ ADD . /app/src # Put configs in appropriate locations RUN cp docker/nginx.conf /etc/nginx/sites-enabled/default && \ cp docker/uwsgi.ini /etc/uwsgi/mafiasi-dashboard.ini && \ - cp docker/supervisor.conf /etc/supervisor/conf.d/app.conf && \ - touch /app/config/jabber_cert_fingerprint + cp docker/supervisor.conf /etc/supervisor/conf.d/app.conf RUN mkdir -p /app/static/mathjax RUN cp -rT /usr/share/javascript/mathjax /app/static/mathjax diff --git a/README.md b/README.md index 74dd2b45..66127a0a 100644 --- a/README.md +++ b/README.md @@ -25,15 +25,6 @@ pipenv run ./manage.py migrate make ``` -If you want to use jabber (ejabberd), you have to load the SQL schema -into the database (you'll find it in the ejabberd source code), -migrate the jabber database and do some changes to the tables -``` -psql jabber < ejabberd-source-code/sql/pg.sql -./manage.py migrate --database jabber -psql jabber < mafiasi/jabber/sql/*.sql -``` - We try to keep these installation instructions up to date, but we can't guarantee. diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index cc5bbbc0..62160a62 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -1408,97 +1408,6 @@ msgstr "Einladungsmails" msgid "Invitation mail was resent." msgstr "Einladungsmail wurde erneut versandt." -#: mafiasi/jabber/apps.py:9 mafiasi/jabber/templates/jabber/index.html:5 -msgid "Jabber" -msgstr "Jabber" - -#: mafiasi/jabber/apps.py:10 -msgid "" -"On our Jabber server you can chat with your fellow students, which are " -"already on your contact list." -msgstr "" -"Auf unserem Jabber-Server hast du deine Kommilitonen automatisch in der " -"Kontaktliste und kannst mit ihnen chatten." - -#: mafiasi/jabber/templates/jabber/index.html:10 -#, python-format -msgid "" -"Your Jabber ID is %(username)s@%(jabber_domain)s. Note: " -"it's different from your username." -msgstr "" -"Deine Jabber-ID lautet abweichend: %(username)s@%(jabber_domain)s." - -#: mafiasi/jabber/templates/jabber/index.html:12 -#, python-format -msgid "Your Jabber ID is %(username)s@%(jabber_domain)s." -msgstr "" -"Deine Jabber-ID lautet: %(username)s@%(jabber_domain)s." - -#: mafiasi/jabber/templates/jabber/index.html:17 -#, python-format -msgid "" -"

If you want to change your Jabber password, just change it in your account settings.

" -msgstr "" -"

Wenn du dein Jabber-Passwort ändern möchtest, ändere einfach dein " -"Passwort in den Account-Einstellungen.

" - -#: mafiasi/jabber/templates/jabber/index.html:19 -#: mafiasi/mumble/templates/mumble/index.html:23 -msgid "The fingerprint of the current SSL certificate is:" -msgstr "Der Fingerprint des aktuellen SSL-Zertifikats lautet:" - -#: mafiasi/jabber/templates/jabber/index.html:22 -msgid "Configure your Jabber Client" -msgstr "Einrichtung deines Jabber-Clients" - -#: mafiasi/jabber/templates/jabber/index.html:24 -msgid "" -"\n" -" In order to use Jabber, you need to install a Jabber client and " -"configure it\n" -" to connect to the Mafiasi server. One option is Gajim, which is recommended by us.\n" -" " -msgstr "" -"\n" -"Um Jabber nutzen zu können, musst du einen Jabber-Client installieren und " -"dort deinen Mafiasi-Zugang einrichten. Die von uns empfohlene Option ist Gajim." - -#: mafiasi/jabber/templates/jabber/index.html:32 -msgid "" -"\n" -" For Android systems, we recommend using\n" -" Conversations, which is\n" -" a free Jabber client. It is available for free on F-Droid or paid on " -"the\n" -" Play Store.\n" -" " -msgstr "" -"\n" -" Für Android-Systeme empfehlen wir\n" -" Conversations, ein\n" -" freier Jabber-Client, der kostenlos über F-Droid und kostenpflichtig\n" -" im Play Store bezogen werden kann.\n" -"\n" -" " - -#: mafiasi/jabber/templates/jabber/index.html:41 -msgid "" -"\n" -" Below you can see the required configuration for Gajim, Dino, Pidgin and " -"Conversations.\n" -" " -msgstr "" -"\n" -"Unten findest du die nötigen Einstellungen für Gajim, Dino, Pidgin und " -"Conversations." - #: mafiasi/kanboard/apps.py:10 msgid "Kanboard" msgstr "Kanboard" @@ -2101,10 +2010,10 @@ msgstr "Mailadresse ändern" #: mafiasi/registration/templates/registration/account.html:92 msgid "" "Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Jabber)" +"synchronize it with other services (e.g. Bitpoll)" msgstr "" "Hinweis: Du kannst dein Passwört auf das aktuelle Passwort \"ändern\", um es " -"mit anderen Diensten zu synchronisieren (z.B. Jabber)" +"mit anderen Diensten zu synchronisieren (z.B. Bitpoll)" #: mafiasi/registration/templates/registration/account.html:96 msgid "Old password" @@ -3046,18 +2955,6 @@ msgstr "" #~ msgid "e-mails" #~ msgstr "E-Mails" -#, fuzzy -#~| msgid "" -#~| "You have to login to create or manage your Jabber account." -#~ msgid "" -#~ "You have to login " -#~ "to see your Jabber account data." -#~ msgstr "" -#~ "Du musst dich einloggen, um deinen Jabber-Account zu " -#~ "erstellen oder zu verwalten." - #~ msgid "Mafiasi Hub" #~ msgstr "Mafiasi Hub" @@ -3068,21 +2965,6 @@ msgstr "" #~ "Muss mit einem Buchstaben beginnen und nur alphanumerische Zeichen " #~ "enthalten. Nur Kleinbuchstaben." -#~ msgid "Create Jabber account" -#~ msgstr "Jabber-Account erstellen" - -#~ msgid "" -#~ "To create your Jabber account you have to enter your current password:" -#~ msgstr "" -#~ "Um deinen Jabber-Account zu erstellen, musst du dein aktuelles Passwort " -#~ "eingeben:" - -#~ msgid "" -#~ "You can now create your Jabber account." -#~ msgstr "" -#~ "Du kannst nun deinen Jabber-Account erstellen." - #~ msgid "Account was created." #~ msgstr "Account wurde erstellt." @@ -3250,14 +3132,5 @@ msgstr "" #~ msgid "Confirm password:" #~ msgstr "Passwort bestätigen:" -#~ msgid "Reset password of your Jabber account" -#~ msgstr "Jabber-Account-Passwort zurücksetzen" - -#~ msgid "" -#~ "Enter your current password to set the Jabber password to the entered one." -#~ msgstr "" -#~ "Gib dein aktuelles Passwort ein, um das Jabber-Passwort auf dieses " -#~ "zurückzusetzen." - #~ msgid "Reset password" #~ msgstr "Passwort zurücksetzen" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index f5ea29f5..ffeec58f 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -1411,100 +1411,6 @@ msgstr "invitation mails" msgid "Invitation mail was resent." msgstr "Invitation mail was resent." -#: mafiasi/jabber/apps.py:9 mafiasi/jabber/templates/jabber/index.html:5 -msgid "Jabber" -msgstr "Jabber" - -#: mafiasi/jabber/apps.py:10 -msgid "" -"On our Jabber server you can chat with your fellow students, which are " -"already on your contact list." -msgstr "" -"On our Jabber server you can chat with your fellow students, which are " -"already on your contact list." - -#: mafiasi/jabber/templates/jabber/index.html:10 -#, python-format -msgid "" -"Your Jabber ID is %(username)s@%(jabber_domain)s. Note: " -"it's different from your username." -msgstr "" -"Your Jabber ID is %(username)s@%(jabber_domain)s. Note: " -"it's different from your username." - -#: mafiasi/jabber/templates/jabber/index.html:12 -#, python-format -msgid "Your Jabber ID is %(username)s@%(jabber_domain)s." -msgstr "Your Jabber ID is %(username)s@%(jabber_domain)s." - -#: mafiasi/jabber/templates/jabber/index.html:17 -#, python-format -msgid "" -"

If you want to change your Jabber password, just change it in your account settings.

" -msgstr "" -"

If you want to change your Jabber password, just change it in your account settings.

" - -#: mafiasi/jabber/templates/jabber/index.html:19 -#: mafiasi/mumble/templates/mumble/index.html:23 -msgid "The fingerprint of the current SSL certificate is:" -msgstr "The fingerprint of the current SSL certificate is:" - -#: mafiasi/jabber/templates/jabber/index.html:22 -msgid "Configure your Jabber Client" -msgstr "Configure your Jabber Client" - -#: mafiasi/jabber/templates/jabber/index.html:24 -msgid "" -"\n" -" In order to use Jabber, you need to install a Jabber client and " -"configure it\n" -" to connect to the Mafiasi server. One option is Gajim, which is recommended by us.\n" -" " -msgstr "" -"\n" -" In order to use Jabber, you need to install a Jabber client and " -"configure it\n" -" to connect to the Mafiasi server. One option is Gajim, which is recommended by us.\n" -" " - -#: mafiasi/jabber/templates/jabber/index.html:32 -msgid "" -"\n" -" For Android systems, we recommend using\n" -" Conversations, which is\n" -" a free Jabber client. It is available for free on F-Droid or paid on " -"the\n" -" Play Store.\n" -" " -msgstr "" -"\n" -" For Android systems, we recommend using\n" -" Conversations, which is\n" -" a free Jabber client. It is available for free on F-Droid or paid on " -"the\n" -" Play Store.\n" -" " - -#: mafiasi/jabber/templates/jabber/index.html:41 -msgid "" -"\n" -" Below you can see the required configuration for Gajim, Dino, Pidgin and " -"Conversations.\n" -" " -msgstr "" -"\n" -" Below you can see the required configuration for Gajim, Dino, Pidgin and " -"Conversations.\n" -" " - #: mafiasi/kanboard/apps.py:10 msgid "Kanboard" msgstr "Kanboard" @@ -2093,10 +1999,10 @@ msgstr "Change Email" #: mafiasi/registration/templates/registration/account.html:92 msgid "" "Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Jabber)" +"synchronize it with other services (e.g. Bitpoll)" msgstr "" "Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Jabber)" +"synchronize it with other services (e.g. Bitpoll)" #: mafiasi/registration/templates/registration/account.html:96 msgid "Old password" @@ -3018,17 +2924,6 @@ msgstr "" #~ msgid "e-mails" #~ msgstr "Email" -#, fuzzy -#~| msgid "" -#~| "You have to login to create or manage your Jabber account." -#~ msgid "" -#~ "You have to login " -#~ "to see your Jabber account data." -#~ msgstr "" -#~ "You have to login " -#~ "to create or manage your Jabber account." - #~ msgid "Mafiasi Hub" #~ msgstr "Mafiasi Hub" @@ -3039,19 +2934,6 @@ msgstr "" #~ "Must start with a letter and only contain alphanumeric characters. " #~ "Lowercase only." -#~ msgid "Create Jabber account" -#~ msgstr "Create Jabber account" - -#~ msgid "" -#~ "To create your Jabber account you have to enter your current password:" -#~ msgstr "" -#~ "To create your Jabber account you have to enter your current password:" - -#~ msgid "" -#~ "You can now create your Jabber account." -#~ msgstr "" -#~ "You can now create your Jabber account." - #~ msgid "Account was created." #~ msgstr "Account was created." diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index c155c79b..f4d451b5 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -1441,102 +1441,6 @@ msgstr "mails d'invitation" msgid "Invitation mail was resent." msgstr "Invitation courrier était renvoyé." -#: mafiasi/jabber/apps.py:9 mafiasi/jabber/templates/jabber/index.html:5 -msgid "Jabber" -msgstr "Jabber" - -#: mafiasi/jabber/apps.py:10 -msgid "" -"On our Jabber server you can chat with your fellow students, which are " -"already on your contact list." -msgstr "" -"Sur notre serveur Jabber vous pouvez discuter avec vos collègues étudiants, " -"qui sont déjà sur votre liste de contacts." - -#: mafiasi/jabber/templates/jabber/index.html:10 -#, python-format -msgid "" -"Your Jabber ID is %(username)s@%(jabber_domain)s. Note: " -"it's different from your username." -msgstr "" -"Votre Jabber ID est %(username)s@%(jabber_domain)s. " -"Remarque: il est différent de votre nom d'utilisateur." - -#: mafiasi/jabber/templates/jabber/index.html:12 -#, python-format -msgid "Your Jabber ID is %(username)s@%(jabber_domain)s." -msgstr "" -"Votre identifiant Jabber est %(username)s@%(jabber_domain)s." - -#: mafiasi/jabber/templates/jabber/index.html:17 -#, python-format -msgid "" -"

If you want to change your Jabber password, just change it in your account settings.

" -msgstr "" -"

Si vous souhaitez modifier votre mot de passe Jabber, il suffit de " -"changer dans votre paramètres de compte . " - -#: mafiasi/jabber/templates/jabber/index.html:19 -#: mafiasi/mumble/templates/mumble/index.html:23 -msgid "The fingerprint of the current SSL certificate is:" -msgstr "L'empreinte du certificat SSL actuel est:" - -#: mafiasi/jabber/templates/jabber/index.html:22 -msgid "Configure your Jabber Client" -msgstr "Configurez votre client Jabber" - -#: mafiasi/jabber/templates/jabber/index.html:24 -msgid "" -"\n" -" In order to use Jabber, you need to install a Jabber client and " -"configure it\n" -" to connect to the Mafiasi server. One option is Gajim, which is recommended by us.\n" -" " -msgstr "" -"\n" -"En afin d'utiliser Jabber, vous devez installer un client jabber et le " -"configurer \n" -"pour se connecter au serveur Mafiasi. Une option est Gajim, qui est recommendé par nous.\n" -" " - -#: mafiasi/jabber/templates/jabber/index.html:32 -msgid "" -"\n" -" For Android systems, we recommend using\n" -" Conversations, which is\n" -" a free Jabber client. It is available for free on F-Droid or paid on " -"the\n" -" Play Store.\n" -" " -msgstr "" -"\n" -" Pour les systèmes Android, nous recommandons d'utiliser\n" -" Conversations, c'est\n" -" un client Jabber libre. Il est disponible gratuitement sur F-Droid ou " -"payé sur le\n" -" Play Store.\n" -" " - -#: mafiasi/jabber/templates/jabber/index.html:41 -msgid "" -"\n" -" Below you can see the required configuration for Gajim, Dino, Pidgin and " -"Conversations.\n" -" " -msgstr "" -"\n" -" Vous trouverez ci-dessous la configuration requise pour Gajim, Dino, " -"Pidgin et Conversations.\n" -" " - #: mafiasi/kanboard/apps.py:10 msgid "Kanboard" msgstr "Kanboard" @@ -2137,10 +2041,10 @@ msgstr "Modifier adresse é-mail" #: mafiasi/registration/templates/registration/account.html:92 msgid "" "Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Jabber)" +"synchronize it with other services (e.g. Bitpoll)" msgstr "" "Remarque: Vous pouvez \"changement\" votre mot de passe le mot de passe en " -"cours pour le synchroniser avec d'autres services (par exemple, Jabber)" +"cours pour le synchroniser avec d'autres services (par exemple, Bitpoll)" #: mafiasi/registration/templates/registration/account.html:96 msgid "Old password" @@ -3065,17 +2969,6 @@ msgstr "" #~ msgid "e-mails" #~ msgstr "Èmail" -#, fuzzy -#~| msgid "" -#~| "You have to login to create or manage your Jabber account." -#~ msgid "" -#~ "You have to login " -#~ "to see your Jabber account data." -#~ msgstr "" -#~ "Vous devez vous identifier pour créer ou gérer votre compte Jabber." - #~ msgid "Mafiasi Hub" #~ msgstr "Mafiasi Hub" @@ -3086,21 +2979,6 @@ msgstr "" #~ "Doit commencer par une lettre et ne contenir que des caractères " #~ "alphanumériques. Minuscules seulement." -#~ msgid "Create Jabber account" -#~ msgstr "Créez un compte Jabber" - -#~ msgid "" -#~ "To create your Jabber account you have to enter your current password:" -#~ msgstr "" -#~ "Pour créer votre compte Jabber, vous devez entrer votre mot de passe " -#~ "actuel:" - -#~ msgid "" -#~ "You can now create your Jabber account." -#~ msgstr "" -#~ "Vous pouvez maintenant créer votre compte Jabber." - #~ msgid "Account was created." #~ msgstr "Compte a été créé." diff --git a/mafiasi/base/templates/base/licenses.html b/mafiasi/base/templates/base/licenses.html index f5148a76..45a8a11f 100644 --- a/mafiasi/base/templates/base/licenses.html +++ b/mafiasi/base/templates/base/licenses.html @@ -154,7 +154,7 @@

Third-party assets

Glyphicons Halflings (as part of Bootstrap) Jan Kovařík See bootstrap license - Dashboard icons for "Dudel", "Jabber"; some icons in buttons + Dashboard icons for "Bitpoll"; some icons in buttons Redmine logo diff --git a/mafiasi/base/templates/base/technical_info.html b/mafiasi/base/templates/base/technical_info.html index 107cb2bf..b36763a8 100644 --- a/mafiasi/base/templates/base/technical_info.html +++ b/mafiasi/base/templates/base/technical_info.html @@ -63,7 +63,6 @@
  • subscript_and_superscript
  • SOGo
  • -
  • Ejabberd
  • Postfix
  • Sentry
  • diff --git a/mafiasi/jabber/__init__.py b/mafiasi/jabber/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/mafiasi/jabber/admin.py b/mafiasi/jabber/admin.py deleted file mode 100644 index 849332f0..00000000 --- a/mafiasi/jabber/admin.py +++ /dev/null @@ -1,25 +0,0 @@ -from django import forms -from django.contrib import admin - -from mafiasi.base.models import Yeargroup -from mafiasi.jabber.models import ( - DefaultGroup, - JabberUserMapping, - YeargroupSrGroupMapping, -) - - -class YeargroupSrGroupMappingForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - yeargroups = Yeargroup.objects.values_list("id", "name") - self.fields["yeargroup_id"] = forms.ChoiceField(choices=yeargroups) - - -class YeargroupSrGroupMappingAdmin(admin.ModelAdmin): - form = YeargroupSrGroupMappingForm - - -admin.site.register(DefaultGroup) -admin.site.register(JabberUserMapping) -admin.site.register(YeargroupSrGroupMapping, YeargroupSrGroupMappingAdmin) diff --git a/mafiasi/jabber/apps.py b/mafiasi/jabber/apps.py deleted file mode 100644 index 6ba45408..00000000 --- a/mafiasi/jabber/apps.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.utils.translation import gettext_lazy as _ - -from mafiasi.base.base_apps import BaseService - - -class JabberConfig(BaseService): - default = True - name = "mafiasi.jabber" - verbose_name = "Jabber" - title = _("Jabber") - description = _( - "On our Jabber server you can chat with your fellow students, which are already on your contact list." - ) - link = "/jabber/" - image = "img/services/jabber.svg" diff --git a/mafiasi/jabber/dbrouter.py b/mafiasi/jabber/dbrouter.py deleted file mode 100644 index 6c9898b1..00000000 --- a/mafiasi/jabber/dbrouter.py +++ /dev/null @@ -1,23 +0,0 @@ -class JabberRouter(object): - def db_for_read(self, model, **hints): - if model._meta.app_label == "jabber": - return "jabber" - return None - - def db_for_write(self, model, **hints): - if model._meta.app_label == "jabber": - return "jabber" - return None - - def allow_relation(self, obj1, obj2, **hints): - if obj1._meta.app_label == "jabber" or obj2._meta.app_label == "jabber": - return obj1._meta.app_label == obj2._meta.app_label - return None - - def allow_migrate(self, db, app_label, model_name=None, **hints): - if db == "jabber": - return app_label == "jabber" - else: - if app_label == "jabber": - return False - return None diff --git a/mafiasi/jabber/erlangparser.py b/mafiasi/jabber/erlangparser.py deleted file mode 100644 index bb40a2fd..00000000 --- a/mafiasi/jabber/erlangparser.py +++ /dev/null @@ -1,34 +0,0 @@ -import json -import re -from typing import Union - - -def parse(string: str) -> dict: - # To make the data json, the headers have to be quoted and the angle brackets have to be removed - # i.e. {key, <<"value">>} to {"key": "value"} - quoted_headers = re.sub(r"\{(\w+),", r'{"\1":', string) - no_angle_brackets = re.sub(r'<<("[^"]+")>>', r"\1", quoted_headers) - data = json.loads(no_angle_brackets) - # Now, the data is available in Python, but it is a list of one-element dictionaries - # These dictionaries are merged here. - result = dict() - for item in data: - result.update(item) - return result - - -def _sanitize(object_to_sanitize: Union[list, str]) -> Union[list, str]: - # To avoid possible code injections, keep only letters, digits, and whitespace - if isinstance(object_to_sanitize, list): - return [_sanitize(x) for x in object_to_sanitize] - return re.sub(r"[^\w\s]", "", object_to_sanitize) - - -def dump(object: dict) -> str: - # First, the merged dictionary has to be split in a list of one-element dictionaries - data = [{_sanitize(k): _sanitize(v)} for k, v in object.items()] - # Then, the data is stringified and the transformations from before (header quotes, angle brackets) are reverted - string = json.dumps(data) - no_quoted_headers = re.sub(r'\{"(\w+)":', r"{\1,", string) - angle_brackets = re.sub(r'("[^"]+")', r"<<\1>>", no_quoted_headers) - return angle_brackets diff --git a/mafiasi/jabber/migrations/0001_initial.py b/mafiasi/jabber/migrations/0001_initial.py deleted file mode 100644 index f171df0a..00000000 --- a/mafiasi/jabber/migrations/0001_initial.py +++ /dev/null @@ -1,203 +0,0 @@ -# -*- coding: utf-8 -*- - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [] - - operations = [ - migrations.CreateModel( - name="DefaultGroup", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("group_type", models.CharField(max_length=16, choices=[("student", "Student"), ("other", "Other")])), - ], - options={}, - bases=(models.Model,), - ), - migrations.CreateModel( - name="JabberUser", - fields=[ - ("username", models.TextField(serialize=False, primary_key=True)), - ("password", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "users", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="JabberUserMapping", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("mafiasi_user_id", models.IntegerField(unique=True)), - ("jabber_user", models.OneToOneField(to="jabber.JabberUser", on_delete=models.CASCADE)), - ], - options={}, - bases=(models.Model,), - ), - migrations.CreateModel( - name="PrivacyDefaultList", - fields=[ - ("username", models.TextField(serialize=False, primary_key=True)), - ("name", models.TextField()), - ], - options={ - "db_table": "privacy_default_list", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="PrivacyList", - fields=[ - ("id", models.IntegerField(serialize=False, primary_key=True)), - ("username", models.TextField()), - ("name", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "privacy_list", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="PrivacyListData", - fields=[ - ( - "privacy_list", - models.ForeignKey( - related_name="data", - primary_key=True, - db_column="id", - serialize=False, - to="jabber.PrivacyList", - on_delete=models.CASCADE, - ), - ), - ("t", models.CharField(max_length=1)), - ("value", models.TextField()), - ("action", models.CharField(max_length=1)), - ("ord", models.IntegerField()), - ("match_all", models.BooleanField(default=False)), - ("match_iq", models.BooleanField(default=False)), - ("match_message", models.BooleanField(default=False)), - ("match_presence_in", models.BooleanField(default=False)), - ("match_presence_out", models.BooleanField(default=False)), - ], - options={ - "db_table": "privacy_list_data", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="PrivateStorage", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("username", models.TextField()), - ("namespace", models.TextField()), - ("data", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "private_storage", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="Rostergroups", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("username", models.TextField()), - ("jid", models.TextField()), - ("grp", models.TextField()), - ], - options={ - "db_table": "rostergroups", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="Rosteruser", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("username", models.TextField()), - ("jid", models.TextField()), - ("nick", models.TextField()), - ("subscription", models.CharField(max_length=1)), - ("ask", models.CharField(max_length=1)), - ("askmessage", models.TextField()), - ("server", models.CharField(max_length=1)), - ("subscribe", models.TextField(blank=True)), - ("type", models.TextField(blank=True)), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "rosterusers", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="SrGroup", - fields=[ - ("name", models.TextField(serialize=False, primary_key=True)), - ("opts", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "sr_group", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="SrUser", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("jid", models.TextField()), - ("grp", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "sr_user", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="Vcard", - fields=[ - ("username", models.TextField(serialize=False, primary_key=True)), - ("vcard", models.TextField()), - ("created_at", models.DateTimeField()), - ], - options={ - "db_table": "vcard", - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name="YeargroupSrGroupMapping", - fields=[ - ("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)), - ("yeargroup_id", models.IntegerField(unique=True)), - ("sr_group", models.ForeignKey(to="jabber.SrGroup", on_delete=models.CASCADE)), - ], - options={}, - bases=(models.Model,), - ), - migrations.AlterUniqueTogether( - name="sruser", - unique_together=set([("jid", "grp")]), - ), - migrations.AlterUniqueTogether( - name="jabberusermapping", - unique_together=set([("jabber_user", "mafiasi_user_id")]), - ), - migrations.AddField( - model_name="defaultgroup", - name="sr_group", - field=models.ForeignKey(to="jabber.SrGroup", on_delete=models.CASCADE), - preserve_default=True, - ), - ] diff --git a/mafiasi/jabber/migrations/0002_auto_20150515_0237.py b/mafiasi/jabber/migrations/0002_auto_20150515_0237.py deleted file mode 100644 index 2fa74888..00000000 --- a/mafiasi/jabber/migrations/0002_auto_20150515_0237.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("jabber", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="privacylistdata", - name="privacy_list", - field=models.OneToOneField( - related_name="data", - primary_key=True, - db_column="id", - serialize=False, - to="jabber.PrivacyList", - on_delete=models.CASCADE, - ), - ), - ] diff --git a/mafiasi/jabber/migrations/0003_auto_20161011_2104.py b/mafiasi/jabber/migrations/0003_auto_20161011_2104.py deleted file mode 100644 index d8c7d58c..00000000 --- a/mafiasi/jabber/migrations/0003_auto_20161011_2104.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.2 on 2016-10-11 19:04 - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("jabber", "0002_auto_20150515_0237"), - ] - - operations = [ - migrations.AlterField( - model_name="jabberuser", - name="password", - field=models.TextField(default="NO_PASSWORDS_IN_DB_ZYYJN53N3M5QMHNQKLOAQD7E"), - ), - ] diff --git a/mafiasi/jabber/migrations/0004_alter_created_at.py b/mafiasi/jabber/migrations/0004_alter_created_at.py deleted file mode 100644 index 0b1f906e..00000000 --- a/mafiasi/jabber/migrations/0004_alter_created_at.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2 on 2021-09-03 12:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("jabber", "0003_auto_20161011_2104"), - ] - - operations = [ - migrations.AlterField( - model_name="sruser", - name="created_at", - field=models.DateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name="srgroup", - name="created_at", - field=models.DateTimeField(auto_now_add=True), - ), - ] diff --git a/mafiasi/jabber/migrations/__init__.py b/mafiasi/jabber/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/mafiasi/jabber/models.py b/mafiasi/jabber/models.py deleted file mode 100644 index fe871ee3..00000000 --- a/mafiasi/jabber/models.py +++ /dev/null @@ -1,310 +0,0 @@ -import logging -from html import escape - -from django.conf import settings -from django.contrib.auth import get_user_model -from django.db import models, transaction -from django.db.models.signals import post_save -from django.dispatch import receiver -from django.utils.timezone import now - -from mafiasi.base.models import Mafiasi, Yeargroup -from mafiasi.jabber import erlangparser - - -class PrivacyDefaultList(models.Model): - username = models.TextField(primary_key=True) - name = models.TextField() - - class Meta: - db_table = "privacy_default_list" - - def __str__(self): - return "{0}: {1}".format(self.username, self.name) - - -class PrivacyList(models.Model): - id = models.IntegerField(primary_key=True) - username = models.TextField() - name = models.TextField() - created_at = models.DateTimeField() - - class Meta: - db_table = "privacy_list" - - def __str__(self): - return "{0}: {1}".format(self.username, self.name) - - -class PrivacyListData(models.Model): - privacy_list = models.OneToOneField( - PrivacyList, on_delete=models.CASCADE, db_column="id", related_name="data", primary_key=True - ) - t = models.CharField(max_length=1) - value = models.TextField() - action = models.CharField(max_length=1) - ord = models.IntegerField() - match_all = models.BooleanField(default=False) - match_iq = models.BooleanField(default=False) - match_message = models.BooleanField(default=False) - match_presence_in = models.BooleanField(default=False) - match_presence_out = models.BooleanField(default=False) - - class Meta: - db_table = "privacy_list_data" - - def __str__(self): - return str(self.privacy_list) - - -class PrivateStorage(models.Model): - username = models.TextField() - namespace = models.TextField() - data = models.TextField() - created_at = models.DateTimeField() - - class Meta: - db_table = "private_storage" - - def __str__(self): - return self.username - - -class Rostergroups(models.Model): - username = models.TextField() - jid = models.TextField() - grp = models.TextField() - - class Meta: - db_table = "rostergroups" - - def __str__(self): - return "{0} {1}/{2}".format(self.username, self.grp, self.jid) - - -class Rosteruser(models.Model): - username = models.TextField() - jid = models.TextField() - nick = models.TextField() - subscription = models.CharField(max_length=1) - ask = models.CharField(max_length=1) - askmessage = models.TextField() - server = models.CharField(max_length=1) - subscribe = models.TextField(blank=True) - type = models.TextField(blank=True) - created_at = models.DateTimeField() - - class Meta: - db_table = "rosterusers" - - def __str__(self): - return "{0}: {1} ({2})".format(self.username, self.nick, self.jid) - - -class SrGroup(models.Model): - name = models.TextField(primary_key=True) - opts = models.TextField() - created_at = models.DateTimeField(auto_now_add=True) - - class Meta: - db_table = "sr_group" - - def __str__(self): - return self.name - - -class SrUser(models.Model): - jid = models.TextField() - grp = models.TextField() - created_at = models.DateTimeField(auto_now_add=True) - - class Meta: - db_table = "sr_user" - unique_together = ("jid", "grp") - - def __str__(self): - return "{0} in {1}".format(self.jid, self.grp) - - -class JabberUser(models.Model): - username = models.TextField(primary_key=True) - password = models.TextField(default="NO_PASSWORDS_IN_DB_ZYYJN53N3M5QMHNQKLOAQD7E") - created_at = models.DateTimeField() - - class Meta: - db_table = "users" - - def __str__(self): - return self.username - - def get_jid(self): - return "{0}@{1}".format(self.username, settings.JABBER_DOMAIN) - - def set_nickname(self, nickname): - Vcard.objects.filter(username=self.username).delete() - vcard_tpl = "{nick}" - vcard_xml = vcard_tpl.format(nick=escape(nickname, quote=True)) - try: - vcard = Vcard.objects.get(username=self.username) - vcard.vcard = vcard_xml - except Vcard.DoesNotExist: - vcard = Vcard(username=self.username, vcard=vcard_xml, created_at=now()) - vcard.save() - - -class Vcard(models.Model): - username = models.TextField(primary_key=True) - vcard = models.TextField() - created_at = models.DateTimeField() - - class Meta: - db_table = "vcard" - - def __str__(self): - return self.username - - -class JabberUserMapping(models.Model): - jabber_user = models.OneToOneField(JabberUser, on_delete=models.CASCADE) - mafiasi_user_id = models.IntegerField(unique=True) - - class Meta: - unique_together = ("jabber_user", "mafiasi_user_id") - - def __str__(self): - return "{0} owns {1}@{2}".format(self.mafiasi_user, self.jabber_user, settings.JABBER_DOMAIN) - - def _set_mafiasi_user(self, user): - self.mafiasi_user_id = user.pk - - def _get_mafiasi_user(self): - if not hasattr(self, "_mafiasi_user"): - User = get_user_model() - try: - self._mafiasi_user = User.objects.get(pk=self.mafiasi_user_id) - except User.DoesNotExist: - self._mafiasi_user = None - return self._mafiasi_user - - mafiasi_user = property(_get_mafiasi_user, _set_mafiasi_user) - - -class YeargroupSrGroupMapping(models.Model): - yeargroup_id = models.IntegerField(unique=True) - sr_group = models.ForeignKey(SrGroup, on_delete=models.CASCADE) - - def __str__(self): - return "{0} -> {1}".format(self.yeargroup, self.sr_group) - - def _get_yeargroup(self): - if not hasattr(self, "_yeargroup"): - self._yeargroup = Yeargroup.objects.get(pk=self.yeargroup_id) - return self._yeargroup - - def _set_yeargroup(self, yeargroup): - self.yeargroup_id = yeargroup.pk - - yeargroup = property(_get_yeargroup, _set_yeargroup) - - -GROUP_TYPE_CHOICES = ( - ("student", "Student"), - ("other", "Other"), -) - - -class DefaultGroup(models.Model): - group_type = models.CharField(max_length=16, choices=GROUP_TYPE_CHOICES) - sr_group = models.ForeignKey(SrGroup, on_delete=models.CASCADE) - - def __str__(self): - return "{0}: {1}".format(self.get_group_type_display(), self.sr_group) - - -def get_or_create_account(user): - try: - mapping = JabberUserMapping.objects.get(mafiasi_user_id=user.pk) - return mapping.jabber_user - except JabberUserMapping.DoesNotExist: - return create_jabber_account(user) - - -@receiver(post_save, sender=Mafiasi) -def _account_creation_cb(instance, created, **kwargs): - if created: - create_jabber_account(instance) - - -def create_jabber_account(mafiasi): - if mafiasi.is_student: - group_type = "student" - else: - group_type = "other" - - default_groups = DefaultGroup.objects.filter(group_type=group_type) - sr_groups = [dg.sr_group for dg in default_groups] - - if mafiasi.yeargroup: - try: - m = YeargroupSrGroupMapping.objects.get(yeargroup_id=mafiasi.yeargroup.pk) - sr_groups.append(m.sr_group) - except YeargroupSrGroupMapping.DoesNotExist: - logging.exception("Jabber yeargroup missing for user %s", mafiasi) - - user = JabberUser.objects.create(username=mafiasi.username, created_at=now()) - - if mafiasi.first_name: - nickname = "{0} ({1})".format(mafiasi.first_name, mafiasi.username) - else: - nickname = mafiasi.username - user.set_nickname(nickname) - - JabberUserMapping.objects.create(mafiasi_user_id=mafiasi.pk, jabber_user=user) - - jid = user.get_jid() - for sr_group in sr_groups: - SrUser.objects.create(jid=jid, grp=sr_group.name, created_at=now()) - - return user - - -@receiver(post_save, sender=Yeargroup) -def create_yeargroup(instance: Yeargroup, created, **kwargs): - if not created: - # No changes necessary - return - - jabber_group_name = instance.slug - # The sr_group table is the table containing the groups for the shared roster (sr). - # For each yeargroup, all students of the yeargroup are added to the corresponding - # sr_group automatically, via the create_jabber_account hook above. - sr_group = SrGroup.objects.create(name=jabber_group_name, opts=erlangparser.dump({"name": instance.name})) - # Then, the sr group is mapped to the correct yeargroup in mafiasi. - YeargroupSrGroupMapping.objects.create(yeargroup_id=instance.id, sr_group=sr_group) - - if instance.is_student_group: - # To make the new group visible to all other users, it is added to 'jxxxx_seher'. This - # is a group containing all users that should see the other users and the default group - # for new student users. Therefore, only student yeargroups should be added to the groups - # seen by jxxxx_seher, other groups should only see themselves. - # This code is in an atomic transaction to avoid other changes to the options string during - # the operation. Unfortunately, these options are stored as an Erlang string which has to be - # parsed manually. - with transaction.atomic(using=SrGroup.objects.db): - seher_group, _created = SrGroup.objects.get_or_create(name="jxxxx_seher", defaults={"opts": "[]"}) - current_group_options = seher_group.opts - # These options are in the erlang string format - options = erlangparser.parse(current_group_options) - displayed_groups = options.get("displayed_groups", []) - displayed_groups.append(jabber_group_name) - displayed_groups.sort() - options["displayed_groups"] = displayed_groups - seher_group.opts = erlangparser.dump(options) - seher_group.save() - else: - # For non-student groups, make the group view itself. - options = sr_group.opts - data = erlangparser.parse(options) - data["displayed_groups"] = [jabber_group_name] - sr_group.opts = erlangparser.dump(data) - sr_group.save() diff --git a/mafiasi/jabber/sql/srgroup.sql b/mafiasi/jabber/sql/srgroup.sql deleted file mode 100644 index d62d304e..00000000 --- a/mafiasi/jabber/sql/srgroup.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE sr_group ADD PRIMARY KEY(name); diff --git a/mafiasi/jabber/sql/sruser.sql b/mafiasi/jabber/sql/sruser.sql deleted file mode 100644 index 9ea7777a..00000000 --- a/mafiasi/jabber/sql/sruser.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE sr_user ADD COLUMN id SERIAL PRIMARY KEY; diff --git a/mafiasi/jabber/static/css/jabber.css b/mafiasi/jabber/static/css/jabber.css deleted file mode 100644 index dcdc0926..00000000 --- a/mafiasi/jabber/static/css/jabber.css +++ /dev/null @@ -1,77 +0,0 @@ -#gajim-jabber-config-img { - position: relative; - width: 531px; - height: 220px; - background: url(../img/gajim-en.png); - font-size: 14px; - margin: 1em; -} - -#gajim-jabber-config-username { - position: absolute; - top: 58px; - left: 103px; -} - -#gajim-jabber-config-server { - position: absolute; - top: 58px; - left: 315px; -} - -#dino-jabber-config-img { - position: relative; - width: 402px; - height: 255px; - background: url(../img/dino-en.png); - font-size: 15px; - margin: 1em; -} - -#dino-jabber-config-username { - position: absolute; - top: 128px; - left: 63px; -} - -#pidgin-jabber-config-img { - position: relative; - width: 397px; - height: 509px; - background: url(../img/pidgin-en.png); - font-size: 12px; - margin: 1em; -} - -#pidgin-jabber-config-username { - position: absolute; - top: 105px; - left: 190px; -} - -#pidgin-jabber-config-domain { - position: absolute; - top: 132px; - left: 190px; -} - -#pidgin-jabber-config-alias { - position: absolute; - top: 272px; - left: 190px; -} - -#conversations-jabber-config-img { - position: relative; - width: 400px; - height: 445px; - background: url(../img/conversations-en.png); - font-size: 15px; - margin: 1em; -} - -#conversations-jabber-config-username { - position: absolute; - top: 143px; - left: 33px; -} diff --git a/mafiasi/jabber/static/img/conversations-en.png b/mafiasi/jabber/static/img/conversations-en.png deleted file mode 100644 index 83761ee1c188cd234f86879bced88d3054f81d95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44561 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

    72N9gV28eHF9at|9AmL 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 diff --git a/mafiasi/jabber/static/img/dino-en.png b/mafiasi/jabber/static/img/dino-en.png deleted file mode 100644 index 6d1ef8e809ab838d3f5a5a8627a122c59413688b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13125 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 diff --git a/mafiasi/jabber/static/img/pidgin-en.png b/mafiasi/jabber/static/img/pidgin-en.png deleted file mode 100644 index 258fe508d2f6783490717145c60092514c025420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37125 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 Hu0mjf7-3JU diff --git a/mafiasi/jabber/static/js/jabber.js b/mafiasi/jabber/static/js/jabber.js deleted file mode 100644 index 18089fd5..00000000 --- a/mafiasi/jabber/static/js/jabber.js +++ /dev/null @@ -1,4 +0,0 @@ -$('#jabber-screenshot-tabs a').click(function (e) { - e.preventDefault() - $(this).tab('show') -}) diff --git a/mafiasi/jabber/templates/jabber/index.html b/mafiasi/jabber/templates/jabber/index.html deleted file mode 100644 index 725830d0..00000000 --- a/mafiasi/jabber/templates/jabber/index.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} -{% load static %} - -{% block wtitle %}{% block ptitle %}{% trans "Jabber" %}{% endblock %}{% endblock %} - -{% block content %} -

    -{% if user.username != jabber_user.username %} -{% blocktrans with username=jabber_user.username %}Your Jabber ID is {{ username }}@{{ jabber_domain }}. Note: it's different from your username.{% endblocktrans %} -{% else %} -{% blocktrans with username=jabber_user.username %}Your Jabber ID is {{ username }}@{{ jabber_domain }}.{% endblocktrans %} -{% endif %} -
    - -{% url 'registration_account' as account_url %} -{% blocktrans %}

    If you want to change your Jabber password, just change it in your account settings.

    {% endblocktrans %} - -

    {% trans "The fingerprint of the current SSL certificate is:" %}
    -{{ cert_fingerprint }}

    - -

    {% trans 'Configure your Jabber Client' %}

    -

    - {% blocktrans %} - In order to use Jabber, you need to install a Jabber client and configure it - to connect to the Mafiasi server. One option is Gajim, which is recommended by us. - {% endblocktrans %} -

    - -

    - {% blocktrans %} - For Android systems, we recommend using - Conversations, which is - a free Jabber client. It is available for free on F-Droid or paid on the - Play Store. - {% endblocktrans %} -

    - -

    - {% blocktrans %} - Below you can see the required configuration for Gajim, Dino, Pidgin and Conversations. - {% endblocktrans %} -

    - - -
    - - -
    -
    -
    -
    - {{ jabber_user.username }} -
    -
    - {{ jabber_domain }} -
    -
    -
    -
    -
    -
    - {{ jabber_user.username }}@{{ jabber_domain }} -
    -
    -
    -
    -
    -
    - {{ jabber_user.username }} -
    -
    {{ jabber_domain }}
    -
    {{ user_display_name }}
    -
    -
    -
    -
    -
    - {{ jabber_user.username }}@{{ jabber_domain }} -
    -
    -
    -
    -
    - -{% endblock %} - -{% block css %} - -{% endblock %} -{% block js %} - -{% endblock js %} diff --git a/mafiasi/jabber/urls.py b/mafiasi/jabber/urls.py deleted file mode 100644 index 45a00541..00000000 --- a/mafiasi/jabber/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.urls import path - -from .views import index - -urlpatterns = [ - path("", index, name="jabber_index"), -] diff --git a/mafiasi/jabber/views.py b/mafiasi/jabber/views.py deleted file mode 100644 index d0710119..00000000 --- a/mafiasi/jabber/views.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.conf import settings -from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.shortcuts import redirect -from django.template.response import TemplateResponse -from django.utils.translation import gettext_lazy as _ - -from mafiasi.jabber.models import get_or_create_account -from mafiasi.registration.forms import CheckPasswordForm - - -@login_required -def index(request): - jabber_user = get_or_create_account(request.user) - user_display_name = request.user.get_ldapuser().display_name - - return TemplateResponse( - request, - "jabber/index.html", - { - "jabber_user": jabber_user, - "user_display_name": user_display_name, - "jabber_domain": settings.JABBER_DOMAIN, - "cert_fingerprint": settings.JABBER_CERT_FINGERPRINT, - }, - ) diff --git a/mafiasi/settings.py b/mafiasi/settings.py index 92fcc30b..0a1e23e1 100644 --- a/mafiasi/settings.py +++ b/mafiasi/settings.py @@ -13,7 +13,6 @@ TESTING = env.bool("MAFIASI_TESTING", default=False) # Feature toggles -ENABLE_JABBER_INTEGRATION = env.bool("MAFIASI_ENABLE_JABBER_INTEGRATION") ENABLE_EP_INTEGRATION = env.bool("MAFIASI_ENABLE_EP_INTEGRATION") ENABLE_VAULT_INTEGRATION = env.bool("MAFIASI_ENABLE_VAULT_INTEGRATION") @@ -274,20 +273,6 @@ }, ] -if ENABLE_JABBER_INTEGRATION: - JABBER_DOMAIN = "jabber.mafiasi.de" - JABBER_CERT_FINGERPRINT_FILE = str(env.path("MAFIASI_JABBER_CERT_FINGERPRINT_FILE")) - if os.path.isfile(JABBER_CERT_FINGERPRINT_FILE): - JABBER_CERT_FINGERPRINT = ( - subprocess.check_output(["openssl", "x509", "-in", JABBER_CERT_FINGERPRINT_FILE, "-noout", "-fingerprint"]) - .decode() - .strip() - ) - else: - JABBER_CERT_FINGERPRINT = "" - INSTALLED_APPS.insert(INSTALLED_APPS.index("mafiasi.mattermost"), "mafiasi.jabber") - DATABASES["jabber"] = env.dj_db_url("MAFIASI_DB_JABBER", default="sqlite://:memory:") - if ENABLE_EP_INTEGRATION: DATABASES["etherpad"] = env.dj_db_url("MAFIASI_DB_ETHERPAD", default="sqlite://:memory:") ETHERPAD_API_KEY = env.str("MAFIASI_EP_API_KEY") @@ -298,8 +283,6 @@ VAULT_URL = env.str("MAFIASI_VAULT_URL", default="https://vault.mafiasi.de") VAULT_ADMIN_TOKEN = env.str("MAFIASI_VAULT_ADMIN_TOKEN") -DATABASE_ROUTERS = ["mafiasi.jabber.dbrouter.JabberRouter", "ldapdb.router.Router"] - PROJECT_NAME = "mafiasi.de" PROJECT_BANNER = "Mafiasi Hub" BANNER_IMG = "" From a0a13c5a322e2ba691e567b8cc3550f04afe71cb Mon Sep 17 00:00:00 2001 From: kritzl Date: Tue, 13 Jun 2023 12:29:44 +0200 Subject: [PATCH 2/7] remove Mattermost --- locale/de_DE/LC_MESSAGES/django.po | 8 -------- locale/en_US/LC_MESSAGES/django.po | 8 -------- locale/fr_FR/LC_MESSAGES/django.po | 8 -------- mafiasi/mattermost/__init__.py | 0 mafiasi/mattermost/apps.py | 14 -------------- mafiasi/mattermost/urls.py | 7 ------- mafiasi/mattermost/views.py | 17 ----------------- mafiasi/settings.py | 2 -- 8 files changed, 64 deletions(-) delete mode 100644 mafiasi/mattermost/__init__.py delete mode 100644 mafiasi/mattermost/apps.py delete mode 100644 mafiasi/mattermost/urls.py delete mode 100644 mafiasi/mattermost/views.py diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 62160a62..08821d07 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -1567,14 +1567,6 @@ msgstr "" "Matrix ermöglicht dezentrales Chatten und VoIP mit Ende-zu-Ende-" "Verschlüsselung." -#: mafiasi/mattermost/apps.py:10 -msgid "Chat" -msgstr "Chat" - -#: mafiasi/mattermost/apps.py:11 -msgid "An online team chat service" -msgstr "Mattermost ist ein Online-Chatservice für Teams" - #: mafiasi/mumble/apps.py:9 mafiasi/mumble/templates/mumble/index.html:5 msgid "Mumble" msgstr "Mumble" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index ffeec58f..17e34bfa 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -1567,14 +1567,6 @@ msgstr "Matrix" msgid "Matrix provides decentralized messaging and VoIP with E2E encryption." msgstr "Matrix provides decentralized messaging and VoIP with E2E encryption." -#: mafiasi/mattermost/apps.py:10 -msgid "Chat" -msgstr "Chat" - -#: mafiasi/mattermost/apps.py:11 -msgid "An online team chat service" -msgstr "Mattermost is an online team chat service" - #: mafiasi/mumble/apps.py:9 mafiasi/mumble/templates/mumble/index.html:5 msgid "Mumble" msgstr "Mumble" diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index f4d451b5..1d35e7d9 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -1601,14 +1601,6 @@ msgstr "" "Matrix fournit messagerie décentralisée et VoIP avec chiffrement de bout en " "bout." -#: mafiasi/mattermost/apps.py:10 -msgid "Chat" -msgstr "Chat" - -#: mafiasi/mattermost/apps.py:11 -msgid "An online team chat service" -msgstr "Mattermost est un service de chat de groupe en ligne" - #: mafiasi/mumble/apps.py:9 mafiasi/mumble/templates/mumble/index.html:5 msgid "Mumble" msgstr "Marmonner" diff --git a/mafiasi/mattermost/__init__.py b/mafiasi/mattermost/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/mafiasi/mattermost/apps.py b/mafiasi/mattermost/apps.py deleted file mode 100644 index 41823cd6..00000000 --- a/mafiasi/mattermost/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.conf import settings -from django.utils.translation import gettext_lazy as _ - -from mafiasi.base.base_apps import BaseService - - -class MattermostConfig(BaseService): - default = True - name = "mafiasi.mattermost" - verbose_name = "Mattermost" - title = _("Chat") - description = _("An online team chat service") - link = settings.MATTERMOST_URL - image = "img/services/mattermost.svg" diff --git a/mafiasi/mattermost/urls.py b/mafiasi/mattermost/urls.py deleted file mode 100644 index 43aeb0ff..00000000 --- a/mafiasi/mattermost/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.urls import path - -from .views import get_user_info - -urlpatterns = [ - path("user", get_user_info, name="mattermost_get_user_info"), -] diff --git a/mafiasi/mattermost/views.py b/mafiasi/mattermost/views.py deleted file mode 100644 index 0dbdd34e..00000000 --- a/mafiasi/mattermost/views.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.http import JsonResponse -from oauth2_provider.decorators import protected_resource - - -@protected_resource() -def get_user_info(request): - user = request.resource_owner - - return JsonResponse( - { - "id": user.id, - "username": user.get_username(), - "login": user.get_username(), - "email": user.email, - "name": user.get_full_name(), - } - ) diff --git a/mafiasi/settings.py b/mafiasi/settings.py index 0a1e23e1..a3ef7fe2 100644 --- a/mafiasi/settings.py +++ b/mafiasi/settings.py @@ -163,7 +163,6 @@ "mafiasi.pks", "mafiasi.kanboard", "mafiasi.whiteboard", - "mafiasi.mattermost", "mafiasi.discourse", "mafiasi.fb18", ### @@ -298,7 +297,6 @@ SOGO_URL = "https://sogo.mafiasi.de" GIT_URL = "https://git.mafiasi.de" TAUSCHEN_URL = "https://tauschen.mafiasi.de" -MATTERMOST_URL = "https://mattermost.mafiasi.de" NEXTCLOUD_URL = "https://cloud.mafiasi.de" JITSI_URL = "https://conference.mafiasi.de" DISCOURSE_URL = "https://archiv.mafiasi.de/forum/discourse" From 7620c209612d0f65ab72d038e0544371026f4a33 Mon Sep 17 00:00:00 2001 From: kritzl Date: Tue, 13 Jun 2023 12:53:03 +0200 Subject: [PATCH 3/7] remove unused translations --- locale/de_DE/LC_MESSAGES/django.po | 24 ------------------------ locale/en_US/LC_MESSAGES/django.po | 24 ------------------------ locale/fr_FR/LC_MESSAGES/django.po | 24 ------------------------ 3 files changed, 72 deletions(-) diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 08821d07..d59e12f6 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -1999,30 +1999,6 @@ msgstr "Neue E-Mail-Adresse" msgid "Change Email" msgstr "Mailadresse ändern" -#: mafiasi/registration/templates/registration/account.html:92 -msgid "" -"Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Bitpoll)" -msgstr "" -"Hinweis: Du kannst dein Passwört auf das aktuelle Passwort \"ändern\", um es " -"mit anderen Diensten zu synchronisieren (z.B. Bitpoll)" - -#: mafiasi/registration/templates/registration/account.html:96 -msgid "Old password" -msgstr "Altes Passwort" - -#: mafiasi/registration/templates/registration/account.html:105 -msgid "New password" -msgstr "Neues Passwort" - -#: mafiasi/registration/templates/registration/account.html:114 -msgid "New password confirmation" -msgstr "Neues Passwort bestätigen" - -#: mafiasi/registration/templates/registration/account.html:125 -msgid "Change password" -msgstr "Passwort ändern" - #: mafiasi/registration/templates/registration/email_error.html:5 msgid "Email address is invalid" msgstr "E-Mail-Adresse ist ungültig" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index 17e34bfa..873f7ed5 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -1988,30 +1988,6 @@ msgstr "New Email Address" msgid "Change Email" msgstr "Change Email" -#: mafiasi/registration/templates/registration/account.html:92 -msgid "" -"Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Bitpoll)" -msgstr "" -"Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Bitpoll)" - -#: mafiasi/registration/templates/registration/account.html:96 -msgid "Old password" -msgstr "Old password" - -#: mafiasi/registration/templates/registration/account.html:105 -msgid "New password" -msgstr "New password" - -#: mafiasi/registration/templates/registration/account.html:114 -msgid "New password confirmation" -msgstr "New password confirmation" - -#: mafiasi/registration/templates/registration/account.html:125 -msgid "Change password" -msgstr "Change password" - #: mafiasi/registration/templates/registration/email_error.html:5 msgid "Email address is invalid" msgstr "Email address is invalid" diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 1d35e7d9..8bb84bd0 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -2030,30 +2030,6 @@ msgstr "Nouvel adresse é-mail" msgid "Change Email" msgstr "Modifier adresse é-mail" -#: mafiasi/registration/templates/registration/account.html:92 -msgid "" -"Note: You can \"change\" your password to the current password to " -"synchronize it with other services (e.g. Bitpoll)" -msgstr "" -"Remarque: Vous pouvez \"changement\" votre mot de passe le mot de passe en " -"cours pour le synchroniser avec d'autres services (par exemple, Bitpoll)" - -#: mafiasi/registration/templates/registration/account.html:96 -msgid "Old password" -msgstr "Ancien mot de passe" - -#: mafiasi/registration/templates/registration/account.html:105 -msgid "New password" -msgstr "Nouveau mot de passe" - -#: mafiasi/registration/templates/registration/account.html:114 -msgid "New password confirmation" -msgstr "Nouvelle confirmation de mot de passe" - -#: mafiasi/registration/templates/registration/account.html:125 -msgid "Change password" -msgstr "Changer le mot de passe" - #: mafiasi/registration/templates/registration/email_error.html:5 msgid "Email address is invalid" msgstr "Adresse é-mail ne est pas valide" From 4f5e3321eba5bb0368f53e7b0e50af8bb29be22b Mon Sep 17 00:00:00 2001 From: Timon Engelke Date: Thu, 27 Jul 2023 20:54:33 +0200 Subject: [PATCH 4/7] Add functionality to block gprots based on their hash --- locale/de_DE/LC_MESSAGES/django.po | 29 ++++++++++++-- locale/en_US/LC_MESSAGES/django.po | 28 ++++++++++++-- locale/fr_FR/LC_MESSAGES/django.po | 29 ++++++++++++-- mafiasi/gprot/admin.py | 38 ++++++++++++++++++- .../gprot/migrations/0006_blockedgprots.py | 27 +++++++++++++ mafiasi/gprot/models.py | 9 +++++ .../admin/gprot/gprot/change_form.html | 37 ++++++++++++++++++ mafiasi/gprot/views.py | 21 +++++++++- 8 files changed, 204 insertions(+), 14 deletions(-) create mode 100644 mafiasi/gprot/migrations/0006_blockedgprots.py create mode 100644 mafiasi/gprot/templates/admin/gprot/gprot/change_form.html diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index d59e12f6..fbac592e 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -4,15 +4,15 @@ msgstr "" "Project-Id-Version: Mafiasi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-18 14:54+0100\n" -"PO-Revision-Date: 2023-01-18 14:58+0100\n" -"Last-Translator: Markus Neblung \n" +"PO-Revision-Date: 2023-07-27 20:41+0200\n" +"Last-Translator: Timon Engelke \n" "Language-Team: \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.0.1\n" #: mafiasi/base/middleware.py:15 msgid "" @@ -376,6 +376,18 @@ msgstr "PDF hochladen" msgid "Reminder: Memory minutes for \"%(coursename)s\"" msgstr "Erinnerung: Gedächtnisprotokoll für \"%(coursename)s\"" +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:33 +msgid "Block this Gprot" +msgstr "Dieses GProt blockieren" + +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:34 +msgid "" +"When a Gprot is blocked, a hash is saved that ensures that the same file " +"cannot be uploaded again." +msgstr "" +"Wenn das GProt blockiert ist, dann wird ein Hash gespeichert, der " +"verhindert, dass die gleiche Datei erneut hochgeladen wird." + #: mafiasi/gprot/templates/gprot/_action_list.html:6 msgid "View" msgstr "Anzeigen" @@ -987,7 +999,16 @@ msgstr "Es sind nur PDF-Dateien erlaubt." msgid "Please select a file to upload." msgstr "Bitte wähle eine Datei zum Hochladen aus." -#: mafiasi/gprot/views.py:285 +#: mafiasi/gprot/views.py:217 +msgid "" +"This file was blocked because it is an original exam. Please do not try to " +"upload it again because we will get problems with the university." +msgstr "" +"Der Upload wurde blockiert, weil es sich um eine Originalklausur handelt. " +"Bitte versuche nicht, sie nochmal hochzuladen, damit wir keine Probleme mit " +"der Universität bekommen." + +#: mafiasi/gprot/views.py:307 msgid "Only PNG, JPEG and GIF files are allowed." msgstr "Es sind nur Bilder im PNG-, JPEG- oder GIF-Format erlaubt." diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index 873f7ed5..3bd0860f 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -3,14 +3,14 @@ msgstr "" "Project-Id-Version: Mafiasi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-18 14:47+0100\n" -"PO-Revision-Date: 2022-03-07 16:02+0100\n" -"Last-Translator: Markus Neblung <9neblung@informatik.uni-hamburg.de>\n" +"PO-Revision-Date: 2023-07-27 20:41+0200\n" +"Last-Translator: Timon Engelke \n" "Language-Team: \n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0.1\n" #: mafiasi/base/middleware.py:15 msgid "" @@ -371,6 +371,18 @@ msgstr "Upload PDF" msgid "Reminder: Memory minutes for \"%(coursename)s\"" msgstr "Reminder: Memory minutes for \"%(coursename)s\"" +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:33 +msgid "Block this Gprot" +msgstr "Block this Gprot" + +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:34 +msgid "" +"When a Gprot is blocked, a hash is saved that ensures that the same file " +"cannot be uploaded again." +msgstr "" +"When a Gprot is blocked, a hash is saved that ensures that the same file " +"cannot be uploaded again." + #: mafiasi/gprot/templates/gprot/_action_list.html:6 msgid "View" msgstr "View" @@ -987,7 +999,15 @@ msgstr "Only PDF files are allowed." msgid "Please select a file to upload." msgstr "Please select a file to upload." -#: mafiasi/gprot/views.py:285 +#: mafiasi/gprot/views.py:217 +msgid "" +"This file was blocked because it is an original exam. Please do not try to " +"upload it again because we will get problems with the university." +msgstr "" +"This file was blocked because it is an original exam. Please do not try to " +"upload it again because we will get problems with the university." + +#: mafiasi/gprot/views.py:307 msgid "Only PNG, JPEG and GIF files are allowed." msgstr "Only PNG, JPEG and GIF files are allowed." diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 8bb84bd0..d6d162f8 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -3,15 +3,15 @@ msgstr "" "Project-Id-Version: Mafiasi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-18 14:47+0100\n" -"PO-Revision-Date: 2022-03-07 16:02+0100\n" -"Last-Translator: Markus Neblung <9neblung@informatik.uni-hamburg.de>\n" +"PO-Revision-Date: 2023-07-27 20:48+0200\n" +"Last-Translator: Timon Engelke \n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" #: mafiasi/base/middleware.py:15 msgid "" @@ -380,6 +380,18 @@ msgstr "Télécharger le PDF" msgid "Reminder: Memory minutes for \"%(coursename)s\"" msgstr "Rappel: Mémoire minutes pour \"%(coursename)s\"" +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:33 +msgid "Block this Gprot" +msgstr "Bloquer cette mémoire" + +#: mafiasi/gprot/templates/admin/gprot/gprot/change_form.html:34 +msgid "" +"When a Gprot is blocked, a hash is saved that ensures that the same file " +"cannot be uploaded again." +msgstr "" +"Quand une mémoire est bloquée, un hachage est enregistré pour assurer que le " +"même fichier ne peut plus être téléversé." + #: mafiasi/gprot/templates/gprot/_action_list.html:6 msgid "View" msgstr "Vue" @@ -1006,7 +1018,16 @@ msgstr "Seuls les fichiers PDF sont autorisés." msgid "Please select a file to upload." msgstr "S'il vous plaît sélectionner un fichier à télécharger." -#: mafiasi/gprot/views.py:285 +#: mafiasi/gprot/views.py:217 +msgid "" +"This file was blocked because it is an original exam. Please do not try to " +"upload it again because we will get problems with the university." +msgstr "" +"Le fichier a été bloqué parce qu'il s'agit d'un examen original. Merce de ne " +"pas essayer pas de le téléverser à nouveau afin d'éviter des problèmes avec " +"l'université." + +#: mafiasi/gprot/views.py:307 msgid "Only PNG, JPEG and GIF files are allowed." msgstr "Seuls les fichiers PNG, JPEG et GIF sont autorisés." diff --git a/mafiasi/gprot/admin.py b/mafiasi/gprot/admin.py index 803ec89b..c069a5d6 100644 --- a/mafiasi/gprot/admin.py +++ b/mafiasi/gprot/admin.py @@ -1,7 +1,12 @@ -from django.contrib import admin +import hashlib + +from django.contrib import admin, messages +from django.shortcuts import get_object_or_404, redirect +from django.urls import path, reverse from mafiasi.gprot.models import ( Attachment, + BlockedGprots, Favorite, GProt, Label, @@ -18,6 +23,36 @@ class GProtAdmin(admin.ModelAdmin): list_filter = ("published", "is_pdf") search_fields = ("course__name",) + def get_urls(self): + urls = super().get_urls() + custom_urls = [ + path("/block/", self.admin_site.admin_view(self.block_view), name="gprot_block"), + ] + + return custom_urls + urls + + def block_view(self, request, object_id): + to_block = get_object_or_404(GProt, pk=object_id) + if not to_block.is_pdf: + messages.error(request, "Cannot block, not a PDF") + else: + to_block.published = False + to_block.owner = None + to_block.save() + pdf_filefield = to_block.content_pdf + if not pdf_filefield: + messages.error(request, "Cannot block, no file") + else: + pdf_filefield.file.open() + contents = pdf_filefield.file.read() + pdf_filefield.file.close() + pdf_filefield.delete() + hash = hashlib.sha256(contents).hexdigest() + BlockedGprots.objects.create(pdf_hash=hash, gprot_title=str(to_block), blocked_by=request.user) + messages.success(request, "Successfully blocked") + + return redirect(reverse("admin:gprot_gprot_change", args=(object_id,))) + admin.site.register(GProt, GProtAdmin) @@ -25,3 +60,4 @@ class GProtAdmin(admin.ModelAdmin): admin.site.register(Reminder) admin.site.register(Label) admin.site.register(Favorite) +admin.site.register(BlockedGprots) diff --git a/mafiasi/gprot/migrations/0006_blockedgprots.py b/mafiasi/gprot/migrations/0006_blockedgprots.py new file mode 100644 index 00000000..532d2a74 --- /dev/null +++ b/mafiasi/gprot/migrations/0006_blockedgprots.py @@ -0,0 +1,27 @@ +# Generated by Django 4.1 on 2023-07-27 17:43 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("gprot", "0005_alter_favorite_url"), + ] + + operations = [ + migrations.CreateModel( + name="BlockedGprots", + fields=[ + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("pdf_hash", models.CharField(max_length=64)), + ("gprot_title", models.CharField(max_length=100)), + ( + "blocked_by", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ], + ), + ] diff --git a/mafiasi/gprot/models.py b/mafiasi/gprot/models.py index dcff4eb7..2e4a0b4e 100644 --- a/mafiasi/gprot/models.py +++ b/mafiasi/gprot/models.py @@ -60,6 +60,15 @@ def __str__(self): return "[{0}] {1}: {2}{3}".format(self.pk, self.exam_date, self.course, append) +class BlockedGprots(models.Model): + pdf_hash = models.CharField(max_length=64) + gprot_title = models.CharField(max_length=100) + blocked_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + + def __str__(self): + return "BlockedGprot: {0}".format(self.gprot_title) + + class Attachment(models.Model): gprot = models.ForeignKey(GProt, on_delete=models.CASCADE) file = models.FileField(upload_to=make_attachment_filename) diff --git a/mafiasi/gprot/templates/admin/gprot/gprot/change_form.html b/mafiasi/gprot/templates/admin/gprot/gprot/change_form.html new file mode 100644 index 00000000..60fb762a --- /dev/null +++ b/mafiasi/gprot/templates/admin/gprot/gprot/change_form.html @@ -0,0 +1,37 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} +{% block extrastyle %}{{ block.super }} + +{% endblock %} +{% block after_related_objects %} +
    +{% translate 'Block this Gprot' %} +

    {% blocktranslate %}When a Gprot is blocked, a hash is saved that ensures that the same file cannot be uploaded again.{% endblocktranslate %}

    +
    +
    +{% endblock %} diff --git a/mafiasi/gprot/views.py b/mafiasi/gprot/views.py index 7ca9e705..be6217fe 100644 --- a/mafiasi/gprot/views.py +++ b/mafiasi/gprot/views.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import hashlib import json import time from datetime import date @@ -24,7 +25,14 @@ from raven.contrib.django.raven_compat.models import client from mafiasi.gprot.forms import GProtBasicForm, GProtCreateForm, GProtSearchForm -from mafiasi.gprot.models import Attachment, Favorite, GProt, Notification, Reminder +from mafiasi.gprot.models import ( + Attachment, + BlockedGprots, + Favorite, + GProt, + Notification, + Reminder, +) from mafiasi.gprot.sanitize import clean_html from mafiasi.teaching.forms import CourseForm, TeacherForm from mafiasi.teaching.models import Course, Teacher, insert_autocomplete_courses @@ -195,6 +203,7 @@ def edit_gprot(request, gprot_pk): error = _("Only files up to {0} MB are allowed.").format(settings.GPROT_PDF_MAX_SIZE) if magic.from_buffer(upload.read(1024), mime=True) != "application/pdf": error = _("Only PDF files are allowed.") + else: error = _("Please select a file to upload.") @@ -204,6 +213,16 @@ def edit_gprot(request, gprot_pk): gprot.content_pdf = upload gprot.save() _clean_pdf_metadata(gprot) + # we have to calculate the hash after cleaning the file + gprot.content_pdf.file.open() + pdf_content = gprot.content_pdf.file.read() + gprot.content_pdf.file.close() + hash = hashlib.sha256(pdf_content).hexdigest() + if BlockedGprots.objects.filter(pdf_hash=hash).exists(): + error = _( + "This file was blocked because it is an original exam. Please do not try to upload it again because we will get problems with the university." + ) + gprot.content_pdf.delete() else: content = request.POST.get("content", "") From 4c5b593f50b40bcf4706d318a450fc769d931b78 Mon Sep 17 00:00:00 2001 From: Timon Engelke Date: Mon, 31 Jul 2023 15:29:36 +0200 Subject: [PATCH 5/7] Update dependencies --- Pipfile.lock | 837 ++++++++++++++++++++++++++------------------------- 1 file changed, 419 insertions(+), 418 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 23b78ed7..5b3e91b3 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -37,11 +37,11 @@ }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.7.22" }, "cffi": { "hashes": [ @@ -114,109 +114,113 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_version >= '3.7'", + "version": "==3.2.0" }, "cryptography": { "hashes": [ - "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db", - "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a", - "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039", - "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c", - "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3", - "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485", - "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c", - "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca", - "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5", - "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5", - "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3", - "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb", - "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43", - "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31", - "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc", - "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b", - "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006", - "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a", - "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699" + "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", + "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", + "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", + "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", + "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", + "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", + "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", + "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", + "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", + "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", + "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", + "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", + "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", + "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", + "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", + "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", + "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", + "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", + "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", + "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", + "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", + "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" ], "markers": "python_version >= '3.7'", - "version": "==41.0.1" + "version": "==41.0.2" }, "cryptojwt": { "hashes": [ @@ -258,11 +262,11 @@ }, "django-auth-ldap": { "hashes": [ - "sha256:6d18e747e1d9680360357945b03e0d16a3f50feea94176e2552f29ccf8c2973c", - "sha256:788b5b1ee70054681d7fae7d085deaa76f2fa6f64cc9fe3dd79daef62c2f6121" + "sha256:797931ac5d55c4ca14c179d5892420cc2a98aa81e44323d595f5419c1b45c306", + "sha256:da85f315a05b1327575aa67075049fab8753ddc05521a6fc6195755ff9ab72fd" ], "index": "pypi", - "version": "==4.3.0" + "version": "==4.4.0" }, "django-cache-url": { "hashes": [ @@ -470,11 +474,11 @@ }, "marshmallow": { "hashes": [ - "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78", - "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b" + "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889", + "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c" ], - "markers": "python_version >= '3.7'", - "version": "==3.19.0" + "markers": "python_version >= '3.8'", + "version": "==3.20.1" }, "nameparser": { "hashes": [ @@ -680,45 +684,45 @@ }, "pydantic": { "hashes": [ - "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d", - "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a", - "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc", - "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3", - "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a", - "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7", - "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf", - "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f", - "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91", - "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece", - "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29", - "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60", - "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a", - "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305", - "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766", - "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f", - "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8", - "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276", - "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c", - "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60", - "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896", - "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be", - "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb", - "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298", - "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4", - "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572", - "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d", - "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82", - "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0", - "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4", - "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca", - "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1", - "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f", - "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f", - "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6", - "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e" + "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303", + "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe", + "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47", + "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494", + "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33", + "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86", + "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d", + "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c", + "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a", + "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565", + "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb", + "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62", + "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62", + "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0", + "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523", + "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d", + "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405", + "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f", + "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b", + "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718", + "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed", + "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb", + "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5", + "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc", + "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942", + "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe", + "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246", + "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350", + "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303", + "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09", + "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33", + "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8", + "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a", + "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1", + "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6", + "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d" ], "markers": "python_version >= '3.7'", - "version": "==1.10.9" + "version": "==1.10.12" }, "pygpgme": { "hashes": [ @@ -783,101 +787,101 @@ }, "rapidfuzz": { "hashes": [ - "sha256:0843c53d54d5b7d6122d8f1d7574d8c91a7aacc5c316f74d6e33d98aec82949d", - "sha256:086a2d84c2e497e3ab160ccf164e319bca874d9383d008fcadf91ede8ac7997f", - "sha256:09a6f5cd9f1282da49b8d0747c40f3fea2d64ab5e4c2cc2295baf87ff7a0d062", - "sha256:0de229cb613be060580c71c1674acbde57921c7ed33d7a726e071a2562924113", - "sha256:10313075642a9f1f948d356f4f0803ae28a496d7967b466b9cae1a4be8aa4df3", - "sha256:10f56af1d46fbeaaa0dc50901c2dc439c7a455cfdac2f1acf6cffeb65ae82c48", - "sha256:1465ea085154378e69bf4bc5e27bdac5c94684416882ace31865232adc9239a2", - "sha256:15260263a0c7bffac934a53b6622d77e06e10929ee4d2e62ac6f70c13988f351", - "sha256:167dbce2da6bb5b73d43e53434c5a9d7d1214b658b315420e44044782f4c482b", - "sha256:16c506bac2e0a6f6581b334a7802c2f0d8343ec1d77e5cf9452c33d6219abef8", - "sha256:17b017f9e1b88dfd6d9b03170ef8e86477de0d9d37fbfcbe72ca070cacbe1b65", - "sha256:17e4cbe6632aae7c35101c4b7c498e83f6eacf61be0def4ff98167df30dc69ca", - "sha256:25eea5c8006b6c8747ca204675c9e939f3c4d27167fb43b2aa211443d34f9abd", - "sha256:32a5c47b5153f25eb512dbb91f9850225d2dcfb3404a1c48406726c7732b0726", - "sha256:351d253fdee62d6d0e80c75f0505accc1ce8cc73a50779c60986ef21c92f20f9", - "sha256:362e366e79fcc9a8866b41f20ef4d2987a06f8b134096e659594c059aa8a6d88", - "sha256:39c7d0dbd77a7f28ff85a1dff2afb2ed73e5cd81cca3f654450ed339a271c0ab", - "sha256:3b3e953dcef0302eeb4fe8c7c4907e50d175199fc07da05ad6bd1d8d141ff138", - "sha256:3f2cd9a3760080876fc59edb26926e51d6db44dea65e85f1eb04aa5f58c3bc41", - "sha256:4019def8a18bc867ac61f08a542bf474a7a9b3f662f5d5cd169c9135866562f5", - "sha256:408007b4bc5a0a0cb9bfcdcc8cffa9b71fec6ee53ccdf9c26b57539f7e264ab5", - "sha256:49d900da023eeb3bfbe9feee126312eb9fd0458129aa5a581e4d8d8bf4483d14", - "sha256:4a64ddfb7084b678da7778c1263aee2baae5a2ca55ec5589a022defc38103eb1", - "sha256:4e951c874a0e5b375b2af9b5f264eefc679c0685c166ee0641e703ef0795509b", - "sha256:51bb8f7aa4fe45618e75cdccf08491c752a7f137ffbf7d3afd1809791ac8c326", - "sha256:51f21f37aec6bc117e9083181ddc3cbbcbf56b6506492b128d8e836d3545ca80", - "sha256:53e3c588e7ea158fa80095dd0ff53f49e2ede9a8d71a3a5b964ca045d845a9b9", - "sha256:58ca539cc6ce385d650138a9b1908b05622c2dd08a23d5aea4890523ef3774d5", - "sha256:5a371846f45ed9d24927a8d5222884536c1e171543396b36250fafb2e848bc92", - "sha256:5d4d509e9aa011e1be5e4da7c5062dc4fc3688714687110536925980b3d03ac6", - "sha256:5e11e11880951e767342b56627ab2dc9d3ef90e2605b656e9b5e6e0beadaaf0f", - "sha256:68d910048b36613701ea671de68f701e2c1ba2839295238def840ff1fc1b15f4", - "sha256:69d503a7641b5a63aa53c7aca0b857d38f48cd7bae39f8563679b324e3d2d47a", - "sha256:6c0e96821029c46847df4ff266ea283a2b6163a4f76a4567f9986934e9c4410c", - "sha256:6d4da453fbd8793ebb11bed396f8a4b9041d6227bf055903447305dd7942312f", - "sha256:6ede2d42ad55bd4e7a3394e98c5f58ddace78775493391732d32be61268a4116", - "sha256:6f32791ee045a7b3d6a56208a55d996d5f7a32fdb688f5c5ee899cb7589539eb", - "sha256:6f767d4823002e65c06ea273f952fda2b88775e1c2d508564f04d32cdd7f65b2", - "sha256:712331c1c70c79a219c2ac233b4e25e75ffad51042840d147d5e94519c7d8a1a", - "sha256:7726f67e4a0b2b4392f03aa62e16b12a697156c6735df27b21bd3ab561b01659", - "sha256:788fb03c5acb5b48f5f918f4cbb5dc072498becf018c64e7e27d6b76e63e68b8", - "sha256:79f5a3ab7ff6c46336f38690f0564bc7689cefa180257ed9078c42f75b10c9d2", - "sha256:7af18372f576e36e93f4662bdf64043ac23dfa02d7f768d7e7e1d0211bb9cb35", - "sha256:7c74fde444bcd13ef3a803c578b28f33b4f9edf368f46ca3de57fda456065967", - "sha256:7e181411958d04d5b437a0981e87815e8f1b1909f5ae0e339246d3bc464f53e7", - "sha256:7f2024f83a9300440e845b441e71726471f7567021c1d80796ca02e71c5f0dc2", - "sha256:819d9317c3d86b508d87ab1bca5867f3abc18b902c822bc57366ccc6330a030b", - "sha256:8243bb4bb4db7c3501932ced6a978b284e19c3619b6802455e47bfd0905adb81", - "sha256:83b48b789f2da1688882cba595c40179194ab15ec17ea1d4c9de9ee239649904", - "sha256:851b44130393139cb336aa54c681d595d75a3160b7be330f3acc0c3b9dabce70", - "sha256:88e77ed7d0bd8d9be530c462c921904ada8d3417671eed749784c5a315af334d", - "sha256:8b966344ed4122a71ab8ccdca2954db1ce0d8049cb9bcac58db07558f9d9ec32", - "sha256:8c07e16ab38e717931319cff1340debbf2ef940a1cda4eb70e323079b62df306", - "sha256:8c85bb6946fb02231d1e60ab45c36ecee04ecf7f725e094f5beee798b6b7d36d", - "sha256:91946c496e6f380939dbea14ff6ce6de87480445c09d03964f5374101462594b", - "sha256:9dc7154889937ca5a004d17f62b4798e0af52f69c38eb3112dbdb52b006d4419", - "sha256:9ff1a517de2b1e80ddf1a3037a6ebca9925154c1af70751518d50d5c332e1ec8", - "sha256:a06a08be3cb7d7df7993dd16e84aaf59bd5a7ff98a9f1b3e893d18b273a71c64", - "sha256:a293370448f2e46fdc6e086ac99923015bdc53973a65d3df35aefc685e1a5809", - "sha256:a4a751f216fd1222a4a8c7ceff5180872a156202c3bdca1b337e5a5b09298dfd", - "sha256:a4afab735bb0ac3ec9bafcc35376ed336d26af6140c4d81e4c869e77df77ecd5", - "sha256:a8b8f32463781e4703965c9cf7a609a19a74478f332e0d62cd9d0e7a9db91321", - "sha256:a8bb256b34fcad4f3fa00be6b57fe35bcb54f031911195929145c67d9738ffec", - "sha256:aadc5a8b9859737a8f87831215b7fab0c04afeb960bb987c528421a4e6dfb8b6", - "sha256:b1bf8aba99b267aad0a01dfb44ee39803676007724abcfb72129c350476b2341", - "sha256:b408ac3c7f8c3414bfd5c6044ca4bb385b390bcf5eae3ad884cef48628c131ae", - "sha256:b4995792e106c3f1ab6f56dd6089918b065888e2e55a71e3fea8d0f66bf30989", - "sha256:b7c65112c87568274d399ad7a62902cef17801c2bd047b162e79e43758b3ce27", - "sha256:c089ce856919e03f4dd8f9168d60ac580d30cd0451fd60dcdef73010eca68973", - "sha256:c53cf36cdb10819b7154fefdbffbef442ba567d9c1ca74a7e76fd759ace45e6c", - "sha256:cb08db5c122fea4196483b82f7596e50ef9cab1770f7696c197bf0815ac4dd17", - "sha256:ccc1b5b467766110085c80bb9311d233fccc8ed1ce965aebba3125e1bab04cba", - "sha256:cdbf9a76ea47f14026daaed43a2c2150ab0e9a4d5396909f028380f33e61c522", - "sha256:cdee4f4d04761ce167538adbefa01a64e7cab949d89aa09df39ef0d5e859fb2a", - "sha256:d3264e4a02e4148e30078104fb0c1b6c8eb166ddc5ebe843a22433f58f87dc47", - "sha256:d5fe8054c244bf63be2380efc275edd86da3a706460d42911dc3ff914f3260a5", - "sha256:d72916d27fb88741bfb576b0b0639354ca00f5e91046171c985262c68a86bbb5", - "sha256:db5e71e5a810d2f1163c914e01b3ba241409a98286ac4850ff26076115ae401b", - "sha256:dc7f25e20781c8d42e813516ee4ff9043ecce4a8e25fc94ee6732a83d81c1c99", - "sha256:de784bbe06d32e66617cd20766c37aae2438902d54b3fa608d2e0a929ca705f4", - "sha256:e0755f5ac6c3d1dc2505eb2e6eaf5508ff17b42c084406714fbabf2d50d098b6", - "sha256:e549da8d68ad4ee385c918ea8b9efeda875df9edf6c6b48df927bd061c00bfef", - "sha256:e6772eb7cc4429f1eae5a9b41e5b0b1af8f0d50727c6e338d9ad5bceee01da5a", - "sha256:ea3e46a534de97a6cad2018cb950492a0fcacad380e35440ce3c1c8fef96a261", - "sha256:ec5523d5c08c639cd4e301d42f3ad7c6fb061a1f1cd6b5b627e59af345edfed7", - "sha256:ef3ad80458e47723812976a2ea1282ff207ad20e6cb19da1917f76699bd5aaa5", - "sha256:ef6c38040d868dcc0132fad377aafeb5b2da71354759e77f41ae599316df2dee", - "sha256:f1e23665be5918f979180130babedab9317fbb34cdae237c7defad7e86bc684e", - "sha256:f25d1975e846d07990cf946a5927a932aa7cccd308ae9979b03a58ff1cd80087", - "sha256:f7acc5c9c7cf567372de5b6c817f93db508e7b9bd7f29bd6187df8d2cc60ced5", - "sha256:fb7049dff52cded65184a3d2ff45cfd226bff7314f49a8f4b83f943eea9181a7", - "sha256:fdd2ab5ab56fcaf839a9f58caa8756dbfeba0b3dc187850b763d0a1e6ee9c97a" + "sha256:017a8b5c96665426977df7e55c2e80b4177a918c802fceb6aaa31d89c7dad961", + "sha256:090bd5976d2af005c143fac5364af7eb6b71831a708031983dd78867070517d0", + "sha256:09bb9c0a7006ad6782a3ff1a50843b80551a771ad6736d66943acd3dcb68030b", + "sha256:0a44d6bd5b4b510d5bfa64363d888070fedf55d7044564e9685fc9b6572a9fa5", + "sha256:0bef51399bb733fe7a464183c35ceba092b6e06aeee6fbf52d8759e7f2bed263", + "sha256:0d4b09c39125b5f21c62a6e08e6649fed6951ffc76a0a7e56c7b29e234002721", + "sha256:0df7736854b85ee1bfa775e0cde33a1af16ef0f9127e11f1232bf125af6b038b", + "sha256:105496b727923ea98e6a788becfd018e0da3510338f19d2c7b642775dcadcc2a", + "sha256:15e3586077863d61bf948a0541c7d077ddf4b4ebc59aca1568514bc9a10b8172", + "sha256:173378a1e9503e0239e422515c8dc4dcf70048070cb1d8301adc2722de1625ec", + "sha256:178b32d806c62e4dfe1b19427af27547b565ded64f844d6d19203cede4f4f7ce", + "sha256:178bb9e57d940f22a828ec916639268c3fd6ee1d45e1cefd7a7022645d816ce0", + "sha256:1a392b4ca7bccd5e98e767305bb282d3effa466f52b8c803d7def812dd61775e", + "sha256:1b1b2eab728efc239c8aab97b4821f8e10dcd5a1b066365d0e38023e3b2289e8", + "sha256:24b84c09ad66c24fbaec0d1f72e74d0cb7ee86e8bf6429281c69377dba76ac67", + "sha256:2510fc00b47a8355485b0014b49b58437594b48a0f08d557de7ea9819ef31967", + "sha256:2bd27356081b0b5ea3164dc45945e56a9ff3aac89f6df83835852ed377e274a0", + "sha256:2e03f99ffca1774ef1fe0bec473cb95a67af254ba03a2f3ff241581edb8b7954", + "sha256:35219597d11f2d863b1bb774e98b6a0e1881d96033cf90b580b1d82192b5c809", + "sha256:37238a2e8066e1573d2035906c77e58d4bbc5c50812bb667acb7975960260fed", + "sha256:37aa3caedc3553d38076a9f90abf8e6affa35b6b3db2e06c414636a95dd646f2", + "sha256:39943285af1b3884bfbf4d51376bce180f0456a5b04e766416c1af9a4b62b93a", + "sha256:3ad583c2f6595f8c261bfdac1485449e900c580b4dff25ecec2abc13dde29447", + "sha256:3bfeb47bc0be4b032462ba066b4198e79ef96a57a6bf5f6b64f1c63e5362000d", + "sha256:3c764f61cbb999ee92ea4e46e81a1e09d75ad00433cd19e9622808134d619a1d", + "sha256:3ca6fac652b195f8eff608b00c0c79889b7cb2984125abfbd14f6fb3f6effe25", + "sha256:3d93e61486d3d4767e46b108e19586038ce4e8d374c719a1dc0b1077d6007a11", + "sha256:3dbd9bf09ed895a01d1aca3d82b1ce3656d1b121650ee8d640e0e17ba24e9e31", + "sha256:45131c2bf9b6c739ffde137e6c56af65786a17a53b0c6e6ca3bba762bb063a9a", + "sha256:45c5e5d813569c4b613965bbfc7e5413615731aea9f932ea6f1854203ea52f9a", + "sha256:45e639069ecdb2aa33a2dc4a2b4c30f0bc35067830dbe5786031121ae9ac9eb6", + "sha256:47d532d6132d5fa40a3f1d3ea7c8752ca5e2ccf50a1aee5c5da16be7f04d8218", + "sha256:493e00f8664ade67574cf0e7984f53bc1dbfd018b0a8102e326bee002acdcd3f", + "sha256:4aec1e9d5416030f77de7e909af2645cc935e999da7e15d59d7e23b37a7a10ed", + "sha256:4f97190786e089e7a413d20b6c3964981fb1e21d7580c094dde08dbb17fd1171", + "sha256:5156692990dd9ddbd4734ff50c6b511c054aa660177fca64d214de57d54257a4", + "sha256:5289d882afb7e1ec7c6d33493f7964cc75fbaf298dcc1e3fbb1f0039560ddc7d", + "sha256:54a76e7b9093c99831bd5cc6513caf1689ec7d6e5123ec547444776fdf309592", + "sha256:555053d9c4ed1ad7d0bf78617ec474ab436a7be94966e98de79cf226d7e9a341", + "sha256:5a2e2203c4b7ecfe78a443810fcf2fcc1e1d96d59d3e704734e21b6f710df3f1", + "sha256:5f1f6f18f23f2744a58b0d02f07d31f5fc104ba2e6c81fbb51ecd50e96a3374c", + "sha256:6031a0985b0ecc72f3f9704efb4a2e7db77c315f732a953a13fb0900204c3047", + "sha256:60332a597794c3b184d240c8306d6b2fc4e6fd4606c1186bb08af41986b827cd", + "sha256:621ece875ea3150bee10605ec2be957055bddd23abafb981047fe7840027f1b0", + "sha256:66fbe9d6764c92a26e3c1c391476ce29e99c5bf1b823051a2bbae4e1d23671be", + "sha256:6ceaaa418e594438240bd287f093bca33c7ee3b6c40e8ce6a74ebdcc9f280f9d", + "sha256:6e29be51831c5a839268cddfa895a4833dfe6541611759bdc485eb8ebdf0b310", + "sha256:702a238fdc50d5d545f381d817f9141baff51d3014768286a07433a0790d33ce", + "sha256:70bfe4be52b300973f16206ace8216b9a5607c89039f5ced1eb048a60e098624", + "sha256:710e107a0977d53b29a68d89fef476fb378dc97cbbe81729f9e7dcc55c86c844", + "sha256:7361a2879b827516203f61d12af8bbb7bea504d7b4d5c02a745bd6bb3fbd4326", + "sha256:7553b67e575fe506fcc760f5ca3582185cb5599845ce27d63cd653a37fede925", + "sha256:77a3724f13fbc3ef867012f353d064459f618918f74a3276bffdb523e39350c9", + "sha256:785e330257b5d6ad1b59334d5af2253fccee6f921feb85e8e18662479f29be4f", + "sha256:7a88342b03c6c41b0ee8f5504d3a30bf47070f87b8bcfc63290e908ff0a212f5", + "sha256:85a85d2a9e8c7af690fe4056c1e48ce641a77cf48688751ff95c86f2a44fc5ec", + "sha256:8be1910ff15bc5f22ac5fadcd3f0877a6eb9eba40f2d17303e8cd898d36f49f5", + "sha256:93c004f0656d683ea69f8b6e41cd14313b94e9d108529c9dca4a9e864d5dac48", + "sha256:94af8500ec952154144f54918d150f04bd2e520c94a27bdd186f57323b0b7b5b", + "sha256:a45faa1a24fd3e078567ee31b953fe6e5819e9286a14f68c72c5689f14242f68", + "sha256:a7c41b1ab1532993d203eda9ab82bb8b7269717a7dc424b05ba39f1e39be5ddc", + "sha256:a996bf1859fb103ef34c24fe13d420714bbd4a43c50fa2cf44bb7d60b6060de3", + "sha256:a9c0bdb945a8fc6cb8d661da3d3969dd0a26202d7c17adb896c393c12cce9d10", + "sha256:a9dd80426417b07e3b86be44b7f7076086cd8290e1bbf1aa391f79e2807b1b8c", + "sha256:afa9a09ff78e40b2372ce2d4acee44165d2f7db7e253d670db93fe8a5d4b00b9", + "sha256:b5d3558e949f3de0081a5f6f8fa74a5a260ca9612e03be9cab8d7289c6bee8ad", + "sha256:b6e847d7558255483b399b6931e425143f68b8e0c176d30034c36a87dda4b9a9", + "sha256:b93f443705985f5d8c3594015caa2e89749875c9596c834dbc9f86d3c8331a5a", + "sha256:b9abdadae018d7d7fa15e850d5c47ec5e45cf3796258d503986ce17ba4d8a71d", + "sha256:ba1a336b41b71326b2ba735ce9d0b6b22c5160b23fddd9024e0717ead3e0bb90", + "sha256:bbe026e4c8ce47d7f5b802b31e6a0cd35e402b80ff29fa9373ec5ece54629aff", + "sha256:bd04785eaed247cc79149e1c0b01a4ca60efde6976e617231f5bb5ec84eb4c80", + "sha256:be05b3fc71b5a92085b4017551b6e3e1c13199c762f82dea0c3fbbae86d24f66", + "sha256:bfbf2e8923874379d035d08f38ef25595ab13a074605fc78b04c79ae3d6b6bdf", + "sha256:c00b7ece60047c3e022e6769f98a343a300976764711ac354c71229f1185787e", + "sha256:c0c15395d1763d89aea084d24564d0b6808988f05a0303d58dc633c27939fcb4", + "sha256:c0ee0733a17e9cc920838b46c43bab43c0e2cee78f091d8c788b162088ffc552", + "sha256:d30297b1ca6666db9171f500ac731e41d57fb5105d629b9115000d3e47cc5823", + "sha256:d45a0c8043e3e543032475d334c4058070865bc75b162dd11959aeebe75dd27f", + "sha256:ddf043aba44e951a6c8ff1addee57d9c3438f1ab3a7edd87ebc951621d8befda", + "sha256:e05b0e3d1803071221eeea695a5a247f3b66f55c3d2e9c2a13ed33ccf67a3f30", + "sha256:e7fc11a86be3df506149d1bf59e9b3edc818fbcada0a4786697b54707e6fc374", + "sha256:e88af8e86fb011adc0221419a5615ed507a54cd74956b07345b8881d81a329e5", + "sha256:eabb81ff00550d77e6a91b127f08a2e3feebc238596c37dad29dca4df4c212da", + "sha256:ef867fa13f7f064200a41299a442d92180b178edd0fe81a1f5222739b2572249", + "sha256:f0e128aa3dcc422c55d55de39dbbcce1401947c4215a5dcd36331151e8ee77ce", + "sha256:f1b9e00ae857fdd6d52bd6d7e1b5598c54bcd0194f4626abfd2eb4e93a8dfebd", + "sha256:f28e33a5940cbaec2095aab516423728aa11d93d01ab6574c304894abe71e007", + "sha256:f3c69967ba33327e8e22a3a0ff3c22b3879ad0f885a097ff2a5c1fe7dbd8505f", + "sha256:fa05dd24202001c2d9811cae12ed9942de240faff3cb37fc25ba2722026b7acb", + "sha256:fa439e73f8aa4f66e89fbc2bce6b2ae882d75ea4e4d75e5e584376db4f5fd73a", + "sha256:fa910442085e9e141259110e4a228f6a2860fa7bd85872707188f9ddd2479153" ], "markers": "python_version >= '3.7'", - "version": "==3.1.1" + "version": "==3.1.2" }, "raven": { "hashes": [ @@ -900,11 +904,11 @@ "django" ], "hashes": [ - "sha256:96b4bba2cbe8d07ba2ca161d25a5001d3d9483f88957fd632159710a3f54d499", - "sha256:e34730b3ce295b7598493c5383d5147bcecb7dd623109876192f06aa3b7c6d7f" + "sha256:61a613aa1d1968e22c3b442afa33372cdb974e400afae31f623980fe5b686389", + "sha256:9668fc6262f18c7da2c15f4ab8321afde536504cab8ff2601a4dd16fb584e625" ], "index": "pypi", - "version": "==0.3.0" + "version": "==0.3.1" }, "six": { "hashes": [ @@ -931,19 +935,19 @@ }, "typing-extensions": { "hashes": [ - "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", - "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" ], - "markers": "python_version >= '3.7'", - "version": "==4.6.3" + "markers": "python_version < '3.11'", + "version": "==4.7.1" }, "urllib3": { "hashes": [ - "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", - "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" ], "markers": "python_version >= '3.7'", - "version": "==2.0.3" + "version": "==2.0.4" }, "webencodings": { "hashes": [ @@ -1045,131 +1049,128 @@ }, "black": { "hashes": [ - "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", - "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", - "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", - "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", - "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", - "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", - "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", - "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", - "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", - "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", - "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", - "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", - "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", - "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", - "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", - "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", - "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", - "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", - "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", - "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", - "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", - "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", - "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", - "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", - "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3" + "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3", + "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb", + "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087", + "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320", + "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6", + "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3", + "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc", + "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f", + "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587", + "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91", + "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a", + "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad", + "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926", + "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9", + "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be", + "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd", + "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96", + "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491", + "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2", + "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a", + "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f", + "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995" ], "index": "pypi", - "version": "==23.3.0" + "version": "==23.7.0" }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.7.22" }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_version >= '3.7'", + "version": "==3.2.0" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", + "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.6" }, "freezegun": { "hashes": [ @@ -1221,27 +1222,27 @@ }, "pathspec": { "hashes": [ - "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687", - "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293" + "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", + "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" ], "markers": "python_version >= '3.7'", - "version": "==0.11.1" + "version": "==0.11.2" }, "platformdirs": { "hashes": [ - "sha256:0ade98a4895e87dc51d47151f7d2ec290365a585151d97b4d8d6312ed6132fed", - "sha256:e48fabd87db8f3a7df7150a4a5ea22c546ee8bc39bc2473244730d4b56d2cc4e" + "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", + "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" ], "markers": "python_version >= '3.7'", - "version": "==3.5.3" + "version": "==3.10.0" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.7'", + "version": "==1.2.0" }, "py": { "hashes": [ @@ -1285,49 +1286,49 @@ }, "pyyaml": { "hashes": [ - "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", - "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", - "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", - "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", - "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", - "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", - "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", - "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", - "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", - "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", - "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", - "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", - "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", - "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", - "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", - "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", - "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", - "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", - "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", - "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", - "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", - "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", - "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", - "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", - "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", - "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", - "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", - "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", - "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", - "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", - "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", - "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", - "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", - "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", - "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", - "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", - "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", - "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", - "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", - "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "markers": "python_version >= '3.6'", - "version": "==6.0" + "version": "==6.0.1" }, "requests": { "hashes": [ @@ -1339,11 +1340,11 @@ }, "responses": { "hashes": [ - "sha256:8a3a5915713483bf353b6f4079ba8b2a29029d1d1090a503c70b0dc5d9d0c7bd", - "sha256:c4d9aa9fc888188f0c673eff79a8dadbe2e75b7fe879dc80a221a06e0a68138f" + "sha256:5d5a2ce3285f84e1f107d2e942476b6c7dff3747f289c0eae997cb77d2ab68e8", + "sha256:9d49c218ba3079022bd63427f12b0a43b43d2f6aaf5ed859b9df9d733b4dd775" ], "index": "pypi", - "version": "==0.23.1" + "version": "==0.23.2" }, "six": { "hashes": [ @@ -1363,18 +1364,18 @@ }, "types-pyyaml": { "hashes": [ - "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f", - "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97" + "sha256:7d340b19ca28cddfdba438ee638cd4084bde213e501a3978738543e27094775b", + "sha256:a461508f3096d1d5810ec5ab95d7eeecb651f3a15b71959999988942063bf01d" ], - "version": "==6.0.12.10" + "version": "==6.0.12.11" }, "urllib3": { "hashes": [ - "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", - "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" ], "markers": "python_version >= '3.7'", - "version": "==2.0.3" + "version": "==2.0.4" } } } From e7d29b762420bfec87ab33dc1b3ad95147cff6b3 Mon Sep 17 00:00:00 2001 From: Timon Engelke Date: Mon, 31 Jul 2023 15:32:27 +0200 Subject: [PATCH 6/7] Add apt update to CI --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e742a681..382f3cc3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,6 +30,7 @@ jobs: run: pip install pipenv - name: install project dependencies run: | + sudo apt update sudo apt install -y --no-install-recommends libgpgme-dev libsasl2-dev libldap2-dev libmagic-dev libjpeg-dev libgraphviz-dev gettext pipenv sync --dev - name: run tests @@ -47,6 +48,7 @@ jobs: run: pip install pipenv - name: install project dependencies run: | + sudo apt update sudo apt install -y --no-install-recommends libgpgme-dev libsasl2-dev libldap2-dev libmagic-dev libjpeg-dev libgraphviz-dev gettext pipenv sync --dev - name: compile i18n messages From be210f8fbcfc8f5f4d0859e53cd125b6038dc62a Mon Sep 17 00:00:00 2001 From: Timon Engelke Date: Thu, 3 Aug 2023 17:42:58 +0200 Subject: [PATCH 7/7] Do not remove author of gprot when it is blocked --- mafiasi/gprot/admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mafiasi/gprot/admin.py b/mafiasi/gprot/admin.py index c069a5d6..7aabe1dd 100644 --- a/mafiasi/gprot/admin.py +++ b/mafiasi/gprot/admin.py @@ -37,7 +37,6 @@ def block_view(self, request, object_id): messages.error(request, "Cannot block, not a PDF") else: to_block.published = False - to_block.owner = None to_block.save() pdf_filefield = to_block.content_pdf if not pdf_filefield: