diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 54f064594cd7f467ed5cf9e0f45893424e7fd210..5005d704718e7d21c322d8014288df3fb898a44c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -12,45 +12,94 @@ Unreleased
 Added
 ~~~~~
 
-* OpenID connect scope and accompanying claim `groups`
-* Support config files in JSON format
+* Provide an ``ExtensiblePolymorphicModel`` to support the features of extensible models for polymorphic models and vice-versa.
 
 Changed
 ~~~~~~~
 
-* Do not log or e-mail ALLOWED_HOSTS violations
 * Replace dev.sh helper script with tox environments.
 
+`2.0`_ - 2021-10-29
+-------------------
+
+Changed
+~~~~~~~
+
+* Refactor views/forms for creating/editing persons.
+
 Fixed
 ~~~~~
 
-* Show link to imprint in footer
-* Fix API for adding OAuth scopes in AppConfigs
+* Fix order of submit buttons in login form and restructure login template
+  to make 2FA work correctly.
+* Fix page title bug on the impersonate page.
+* Users were able to edit the linked user if self-editing was activated.
+* Users weren't able to edit the allowed fields although they were configured correctly.
+* Provide `style.css` and icon files without any authentication to avoid caching issues.
+
 
 Removed
 ~~~~~~~
 
-* Dropped data anonymization (django-hattori) support for now
+* Remove mass linking of persons to accounts, bevcause the view had performance issues,
+  but was practically unused.
 
-`2.0rc5`_ - 2021-08-25
+`2.0rc7`_ - 2021-10-18
+----------------------
+
+Fixed
+~~~~~
+
+* Configuration mechanisms for OpenID Connect were broken.
+* Set a fixed version for django-sass-processor to avoid a bug with searching ``style.css`` in the wrong storage.
+* Correct the z-index of the navbar to display the main title again on mobile devices.
+
+Removed
+~~~~~~~
+
+* Leftovers from a functionality already dropped in the development process
+  (custom authentication backends and alternative login views).
+
+`2.0rc6`_ - 2021-10-11
 ----------------------
 
 Added
 ~~~~~
 
+* OpenID Connect scope and accompanying claim ``groups``
+* Support config files in JSON format
 * Allow apps to dynamically generate OAuth scopes
 
+Changed
+~~~~~~~
+
+* Do not log or e-mail ALLOWED_HOSTS violations
+* Update translations.
+* Use initial superuser settings as default contact and from addresses
+
 Fixed
 ~~~~~
 
-* The view for getting the progress of celery tasks didn't respect that there can be anonymous users.
-* Updated django to latest 3.2.x
+* Show link to imprint in footer
+* Fix API for adding OAuth scopes in AppConfigs
+* Deleting persons is possible again.
+* Removed wrong changelog section
 
 Removed
 ~~~~~~~
 
-* `OAUTH2_SCOPES` setting in apps is not supported anymore. Use `get_all_scopes` method
-  on `AppConfig` class instead.
+* Dropped data anonymization (django-hattori) support for now
+* ``OAUTH2_SCOPES`` setting in apps is not supported anymore. Use ``get_all_scopes`` method
+  on ``AppConfig`` class instead.
+
+`2.0rc5`_ - 2021-08-25
+----------------------
+
+Fixed
+~~~~~
+
+* The view for getting the progress of celery tasks didn't respect that there can be anonymous users.
+* Updated django to latest 3.2.x
 
 
 `2.0rc4`_ - 2021-08-01
@@ -104,9 +153,6 @@ Added
 
 * Add option to disable dashboard auto updating as a user and sitewide.
 
-`2.0rc1` - 2021-06-23
-----------------------
-
 Changed
 ~~~~~~~
 
@@ -178,14 +224,14 @@ Added
 * Allow defining several search configs for LDAP users and groups
 * Use setuptools entrypoints to find apps
 * Add django-cachalot as query cache
-* Add `syncable_fields` property to `ExtensibleModel to discover fields
+* Add ``syncable_fields`` property to ``ExtensibleModel`` to discover fields
   sync backends can write to
-* Add `aleksis-admin` script to wrap django-admin with pre-configured settings
+* Add ``aleksis-admin`` script to wrap django-admin with pre-configured settings
 * Auto-create persons for users if matching attributes are found
-* Add `django-allauth` to allow authentication using OAuth, user registration,
+* Add ``django-allauth`` to allow authentication using OAuth, user registration,
   password changes and password reset
 * Add OAuth2 and OpenID Connect provider support
-* Add `django-uwsgi` to use uWSGI and Celery in development
+* Add ``django-uwsgi`` to use uWSGI and Celery in development
 * Add loading page for displaying Celery task progress
 * Implement generic PDF generation using Chromium
 * Support Amazon S3 storage for /media files
@@ -223,7 +269,7 @@ Changed
 * Default search index backend is now Whoosh with Redis storage
 * Re-style search result page
 * Move notifications to separate page with indicator in menu
-* Move to `BigAutoField` for all AlekSIS apps
+* Move to ``BigAutoField`` for all AlekSIS apps
 * Require Django 3.2 and Python 3.9
 * Person and group lists can now be filtered
 * Allow displaying the default widget to anonymous users
@@ -375,3 +421,6 @@ Fixed
 .. _2.0rc3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc3
 .. _2.0rc4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc4
 .. _2.0rc5: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc5
+.. _2.0rc6: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc6
+.. _2.0rc7: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc7
+.. _2.0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0
diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py
index c14af908faab80f884372e60c6a7ba3ccb8378d0..b549995264811d731cb61a8ed934e579dcefc33e 100644
--- a/aleksis/core/apps.py
+++ b/aleksis/core/apps.py
@@ -5,6 +5,7 @@ from django.apps import apps
 from django.conf import settings
 from django.http import HttpRequest
 from django.utils.module_loading import autodiscover_modules
+from django.utils.translation import gettext as _
 
 from dynamic_preferences.registries import preference_models
 from health_check.plugins import plugin_dir
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 642364b1b331f37720bdbb5798ac20b33786b79b..740fd24b3b5d82c1df5c50d2ad78aa7d71a92292 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -13,7 +13,6 @@ from allauth.account.forms import SignupForm
 from allauth.account.utils import get_user_model, setup_user_email
 from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget
 from dynamic_preferences.forms import PreferenceForm
-from guardian.core import ObjectPermissionChecker
 from material import Fieldset, Layout, Row
 
 from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm
@@ -34,56 +33,8 @@ from .registries import (
 from .util.core_helpers import get_site_preferences
 
 
-class PersonAccountForm(forms.ModelForm):
-    """Form to assign user accounts to persons in the frontend."""
-
-    class Meta:
-        model = Person
-        fields = ["last_name", "first_name", "user"]
-        widgets = {"user": Select2Widget(attrs={"class": "browser-default"})}
-
-    new_user = forms.CharField(required=False)
-
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-        # Fields displayed only for informational purposes
-        self.fields["first_name"].disabled = True
-        self.fields["last_name"].disabled = True
-
-    def clean(self) -> None:
-        user = get_user_model()
-
-        if self.cleaned_data.get("new_user", None):
-            if self.cleaned_data.get("user", None):
-                # The user selected both an existing user and provided a name to create a new one
-                self.add_error(
-                    "new_user",
-                    _("You cannot set a new username when also selecting an existing user."),
-                )
-            elif user.objects.filter(username=self.cleaned_data["new_user"]).exists():
-                # The user tried to create a new user with the name of an existing user
-                self.add_error("new_user", _("This username is already in use."))
-            else:
-                # Create new User object and assign to form field for existing user
-                new_user_obj = user.objects.create_user(
-                    self.cleaned_data["new_user"],
-                    self.instance.email,
-                    first_name=self.instance.first_name,
-                    last_name=self.instance.last_name,
-                )
-
-                self.cleaned_data["user"] = new_user_obj
-
-
-# Formset for batch-processing of assignments of users to persons
-PersonsAccountsFormSet = forms.modelformset_factory(
-    Person, form=PersonAccountForm, max_num=0, extra=0
-)
-
-
-class EditPersonForm(ExtensibleForm):
-    """Form to edit an existing person object in the frontend."""
+class PersonForm(ExtensibleForm):
+    """Form to edit or add a person object in the frontend."""
 
     layout = Layout(
         Fieldset(
@@ -142,25 +93,49 @@ class EditPersonForm(ExtensibleForm):
         required=False, label=_("New user"), help_text=_("Create a new account")
     )
 
-    def __init__(self, request: HttpRequest, *args, **kwargs):
+    def __init__(self, *args, **kwargs):
+        request = kwargs.pop("request", None)
         super().__init__(*args, **kwargs)
 
         # Disable non-editable fields
-        person_fields = set([field.name for field in Person.syncable_fields()]).intersection(
-            set(self.fields)
-        )
+        allowed_person_fields = get_site_preferences()["account__editable_fields_person"]
 
-        if self.instance:
-            checker = ObjectPermissionChecker(request.user)
-            checker.prefetch_perms([self.instance])
+        if (
+            request
+            and self.instance
+            and not request.user.has_perm("core.change_person", self.instance)
+        ):
+            # First, disable all fields
+            for field in self.fields:
+                self.fields[field].disabled = True
 
-            for field in person_fields:
-                if not checker.has_perm(f"core.change_person_field_{field}", self.instance):
-                    self.fields[field].disabled = True
+            # Then, activate allowed fields
+            for field in allowed_person_fields:
+                self.fields[field].disabled = False
 
     def clean(self) -> None:
-        # Use code implemented in dedicated form to verify user selection
-        return PersonAccountForm.clean(self)
+        user = get_user_model()
+
+        if self.cleaned_data.get("new_user", None):
+            if self.cleaned_data.get("user", None):
+                # The user selected both an existing user and provided a name to create a new one
+                self.add_error(
+                    "new_user",
+                    _("You cannot set a new username when also selecting an existing user."),
+                )
+            elif user.objects.filter(username=self.cleaned_data["new_user"]).exists():
+                # The user tried to create a new user with the name of an existing user
+                self.add_error("new_user", _("This username is already in use."))
+            else:
+                # Create new User object and assign to form field for existing user
+                new_user_obj = user.objects.create_user(
+                    self.cleaned_data["new_user"],
+                    self.instance.email,
+                    first_name=self.instance.first_name,
+                    last_name=self.instance.last_name,
+                )
+
+                self.cleaned_data["user"] = new_user_obj
 
 
 class EditGroupForm(SchoolTermRelatedExtensibleForm):
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index ef5a6607f526523fb1ba3ca7f43e08ab21629c62..29ee921af8694936e102e32d65b310ac44979fbc 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,23 +18,23 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -76,124 +76,124 @@ msgstr ""
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr ""
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr ""
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr ""
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr ""
 
@@ -224,8 +224,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr ""
 
@@ -238,7 +238,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -296,13 +296,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -353,570 +353,561 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr ""
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr ""
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:955
-msgid "Can link persons to accounts"
-msgstr ""
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 msgid "Can view oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr ""
 
@@ -1028,75 +1019,71 @@ msgstr ""
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr ""
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr ""
 
@@ -1260,7 +1247,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr ""
 
@@ -1997,32 +1984,10 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
-msgid "Link persons to accounts"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
+msgid "Create person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/edit.html:12
@@ -2031,6 +1996,8 @@ msgid "Edit person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 msgid "Impersonate"
 msgstr ""
 
@@ -2042,10 +2009,6 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
-#: aleksis/core/templates/core/person/list.html:17
-msgid "Create person"
-msgstr ""
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr ""
@@ -2082,10 +2045,6 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-msgid "Impersonate user"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2438,64 +2397,70 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2764,107 +2729,107 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
index c66c2fc59010a34863f4e372e19aebc75cfd9631..58d7ae38a2326acb79508cd05c32cab673c58fe9 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index 1418826eb332523177bf5da3fc0b3b7c6b6d1a2f..f392000d5c400048743b02d15cfca5dbb4efd644 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,35 +7,35 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
-"PO-Revision-Date: 2021-08-28 17:33+0000\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
+"PO-Revision-Date: 2021-10-29 14:28+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis/"
-"de/>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
+"aleksis-core/de/>\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: Weblate 4.4\n"
+"X-Generator: Weblate 4.8\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr "OpenID-Connect-Scope"
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden"
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 msgid "Full home postal address"
 msgstr "Vollständige Postanschrift"
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 msgid "Email address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
@@ -77,124 +77,124 @@ msgstr "Nach Namen suchen"
 msgid "Search by contact details"
 msgstr "Nach Kontaktdetails suchen"
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen."
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr "Dieser Benutzername wird bereits genutzt."
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr "Basisdaten"
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 msgid "Address"
 msgstr "Adresse"
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 msgid "Contact data"
 msgstr "Kontaktdaten"
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 msgid "Advanced personal data"
 msgstr "Zusätzliche persönliche Daten"
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr "Neuer Benutzer"
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "Create a new account"
 msgstr "Neues Benutzerkonto erstellen"
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen."
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr "Dieser Benutzername wird bereits genutzt."
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 msgid "Common data"
 msgstr "Allgemeine Daten"
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Personen"
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 msgid "Additional data"
 msgstr "Zusätzliche Datne"
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr "Zeit"
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?"
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr "Wer soll die Ankündigung sehen?"
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr "Schreiben Sie ihre Ankündigung:"
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind."
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein."
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr "Sie benötigen mindestens einen Empfänger."
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 msgid "Account data"
 msgstr "Kontodaten"
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr "Zustimmungen"
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr "Passwort"
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr "Passwort wiederholen"
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen und stimme ihr zu."
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr "Sie müssen zweimal das gleiche Passwort eingeben."
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr "Keine gültige Auswahl."
 
@@ -225,8 +225,8 @@ msgid "{task.status} - {task.result}"
 msgstr "{task.status} - {task.result}"
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr "Anmelden"
 
@@ -239,7 +239,7 @@ msgstr "Registrieren"
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -297,13 +297,13 @@ msgstr "Autorisierte Anwendungen"
 msgid "Admin"
 msgstr "Admin"
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Ankündigungen"
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -354,570 +354,561 @@ msgstr "OAuth2-Anwendungen"
 msgid "People"
 msgstr "Leute"
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Gruppentypen"
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr "Personen und Konten"
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr "Gruppen und Kindgruppen"
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Zusätzliche Felder"
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr "Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 msgid "Linked school term"
 msgstr "Zugeordnetes Schuljahr"
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr "Boolean (Ja/Nein)"
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr "Text (eine Zeile)"
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr "Datum und Uhrzeit"
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr "Dezimalzahl"
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr "Ganze Zahl"
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 msgid "IP address"
 msgstr "IP-Adresse"
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Boolean oder leer (Ja/Nein/weder)"
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr "Text (mehrzeilig)"
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr "URL / Link"
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum."
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr "Person"
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 msgid "Can view address"
 msgstr "Kann Adresse sehen"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 msgid "Can view contact details"
 msgstr "Kann Kontaktdetails sehen"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 msgid "Can view photo"
 msgstr "Kann Foto sehen"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 msgid "Can view persons groups"
 msgstr "Kann Gruppen einer Person sehen"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 msgid "Can view personal details"
 msgstr "Kann persönliche Daten sehen"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr "weiblich"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 msgid "Is person active?"
 msgstr "Ist die Person aktiv?"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr "Vorname"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr "Nachname"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr "Straße"
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr "Hausnummer"
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr "Postleitzahl"
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr "Ort"
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr "Festnetz"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr "Handy"
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr "Foto"
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr "Feldtitel"
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr "Feldtyp"
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 msgid "Addtitional field for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 msgid "Addtitional fields for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr "Gruppe"
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr "Kann Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 msgid "Can view statistics about group."
 msgstr "Kann Statistiken über Gruppen sehen."
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr "Mitglieder"
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr "Ãœbergeordnete Gruppen"
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr "Benutzer"
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr "Anwendung"
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr "Aktivität"
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr "Aktivitäten"
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr "Absender"
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr "Empfänger"
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr "Link"
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr "Gelesen"
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr "Versandt"
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 msgid "Notification"
 msgstr "Benachrichtigung"
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr "Link zur detaillierten Ansicht"
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr "Datum und Uhrzeit des Anzeigestarts"
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr "Anzeigezeitraum"
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 msgid "Announcement"
 msgstr "Ankündigung"
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 msgid "Announcement recipient"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 msgid "Announcement recipients"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 msgid "Widget Title"
 msgstr "Widget-Titel"
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr "Widget aktivieren"
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 msgid "Widget is broken"
 msgstr "Widget ist kaputt"
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr "Größe auf Mobilgeräten"
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 px, 12 Spalten"
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr "Größe auf Tablets"
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr "> 600px, 12 Spalten"
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr "Größe auf Desktopgeräten"
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr "> 992 px, 12 Spalten"
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr "Größe auf großen Desktopgeräten"
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 px, 12 Spalten"
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 msgid "Can edit default dashboard"
 msgstr "Kann Standarddashboard bearbeiten"
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 msgid "Dashboard Widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 msgid "Dashboard Widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 msgid "Icon URL"
 msgstr "Symbol-URL"
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr "Externer-Link-Widget"
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr "Externer-Link-Widgets"
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 msgid "Dashboard widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr "Reihenfolge"
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr "Teil des Standarddashboards"
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 msgid "Dashboard widget order"
 msgstr "Reihenfolge der Dashboard-Widgets"
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 msgid "Dashboard widget orders"
 msgstr "Reihenfolgen der Dashboard-Widgets"
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr "Menü-ID"
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr "Benutzerdefiniertes Menü"
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr "Benutzerdefinierte Menüs"
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr "Benutzerdefiniertes Menüelement"
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr "Benutzerdefinierte Menüelemente"
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr "Titel des Typs"
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 msgid "Can view system status"
 msgstr "Kann Systemstatus sehen"
 
-#: aleksis/core/models.py:955
-msgid "Can link persons to accounts"
-msgstr "Kann Personen mit Benutzerkonten verknüpfen"
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 msgid "Can manage data"
 msgstr "Kann Daten verwalten"
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 msgid "Can impersonate"
 msgstr "Kann sich verkleiden"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr "Kann Suche benutzen"
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr "Kann Konfiguration ändern"
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr "Kann Einstellungen einer Person verändern"
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr "Kann Einstellungen einer Gruppe verändern"
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr "Kann OAuth-Anwendungen hinzufügen"
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr "Can OAuth-Anwendungen auflisten"
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 msgid "Can view oauth applications"
 msgstr "Kann OAuth-Anwendungen sehen"
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr "Kann OAuth-Anwendungen aktualisieren"
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr "Kann OAuth-Anwendungen löschen"
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr "Kann die PDF-Generierung testen"
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr "Zugehörige Datenprüfungsaufgabe"
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr "Problem gelöst"
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 msgid "Notification sent"
 msgstr "Benachrichtigung gesendet"
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr "Datenprüfungsergebnis"
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr "Datenprüfungsergebnisse"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr "Kann Datenprüfungen ausführen"
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr "Kann Datenprüfungsprobleme lösen"
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
@@ -1029,77 +1020,71 @@ msgstr "Sichtbarer Name der Schule"
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist"
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr "Benutzerdefinierte Authentifizierungsbackends aktivieren"
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr "Erlaube Benutzern, ihr Passwort zu ändern"
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr "Registrierung aktivieren"
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr "Verfügbare Sprachen"
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr "E-Mails versenden, wenn Datenprüfungen Probleme finden"
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr "E-Mailempfänger für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr "E-Mail-Empfängergruppen für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr "Zeige Dashboard für Benutzer ohne Login"
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr "Erlaube Benutzern, ihr Dashboard zu bearbeiten"
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr "Felder des Personen-Models welche von ihnen selbst editierbar sind."
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr "Editierbare Felder des Personen-Models welche eine Benachrichtigung für Änderungen auslösen soll"
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr "Kontakt für Benachrichtigung, wenn eine Person ihre Daten ändert"
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr "PDF-Datei-Ablaufdauer"
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr "in Minuten"
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr "Automatisch das Dashboard und seine Widgets aktualisieren"
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
-msgstr ""
-"Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen "
-"Seite)"
+msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen Seite)"
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr "Englisch"
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr "Deutsch"
 
@@ -1294,7 +1279,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr "Passwort zurücksetzen"
 
@@ -2144,39 +2129,11 @@ msgstr ""
 "        die Verwaltenden von AlekSIS an Ihrer Schule.\n"
 "          "
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
-msgid "Link persons to accounts"
-msgstr "Personen mit Benutzerkonten verknüpfen"
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-"\n"
-"        Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n"
-"    Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n"
-"    erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n"
-"    eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n"
-"      "
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr "Aktualisieren"
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr "Existierendes Konto"
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
-msgstr "Neues Konto"
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
+msgid "Create person"
+msgstr "Person erstellen"
 
 #: aleksis/core/templates/core/person/edit.html:12
 #: aleksis/core/templates/core/person/edit.html:13
@@ -2184,6 +2141,8 @@ msgid "Edit person"
 msgstr "Person editieren"
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 msgid "Impersonate"
 msgstr "Verkleiden"
 
@@ -2195,10 +2154,6 @@ msgstr "Kontaktdetails"
 msgid "Children"
 msgstr "Kinder"
 
-#: aleksis/core/templates/core/person/list.html:17
-msgid "Create person"
-msgstr "Person erstellen"
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr "Personen filtern"
@@ -2235,10 +2190,6 @@ msgstr "Einstellungen für %(instance)s"
 msgid "Save preferences"
 msgstr "Einstellungen speichern"
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-msgid "Impersonate user"
-msgstr "Als Benutzer verkleiden"
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2645,81 +2596,91 @@ msgstr "Zurück zur Kontosicherheit"
 msgid "Generate Tokens"
 msgstr "Tokens generieren"
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr "Anmeldung mit Benutzername und Passwort"
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
-msgstr "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
+msgstr ""
+"Sie haben keine Berichtigung, um diese Seite aufzurufen. \n"
+"Bitte loggen Sie sich mit einem anderen Account ein."
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr "Bitte melden Sie sich an, um diese Seite zu sehen."
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 "\n"
-"                      Wir rufen Ihr Telefon jetzt an, \n"
+"                        Wir rufen Ihr Telefon jetzt an, \n"
 "            bitte geben Sie die Zahlen ein, die Sie hören.\n"
-"                    "
+"                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 "\n"
-"                      Wir haben Ihnen per SMS einen Token geschickt, \n"
-"            bitte geben Sie diesen ein.\n"
-"                    "
+"                        Wir haben Ihnen eine SMS geschickt, \n"
+"            bitte geben Sie die Token ein, die wir geschickt haben.\n"
+"                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 "\n"
-"                      Bitte geben Sie den von Ihrem Token-Generator\n"
+"                        Bitte geben Sie den von Ihrem Token-Generator\n"
 "              generierten Token ein.\n"
-"                    "
+"                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
 msgstr ""
 "\n"
-"                    Nutzen Sie dieses Formular um Ihre Backup-Tokens zum Anmelden einzugeben.\n"
-"                Diese Tokens wurden für Sie generiert, um diese gut aufzubewahren. Bitte\n"
+"                      Nutzen Sie dieses Formular um Ihre Backup-Tokens zum "
+"Anmelden einzugeben.\n"
+"                Diese Tokens wurden für Sie generiert, um diese gut "
+"aufzubewahren. Bitte\n"
 "                geben Sie einen dieser Tokens ein, um sich einzuloggen.\n"
-"                  "
+"                    "
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
+msgstr "Gerät aktuell nicht verfügbar?"
+
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr "Oder, alternativ, nutzen Sie eins Ihrer Backup-Telefone:"
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr "Als letzte Möglichkeit können Sie einen Backup-Token nutzen:"
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr "Backup-Token nutzen"
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr "Alternative Anmeldemöglichkeiten nutzen"
 
@@ -2849,7 +2810,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Wir haben Ihnen per SMS einen Token geschickt, bitte geben Sie diesen ein.\n"
+"            Wir haben Ihnen eine SMS geschickt, bitte geben Sie die Tokens "
+"ein, die wir geschickt haben.\n"
 "          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:63
@@ -3060,111 +3022,150 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten."
 msgid "Download PDF"
 msgstr "PDF herunterladen"
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr "Das Schuljahr wurde erstellt."
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen."
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" "
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist."
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
+#~ msgid "Persons and accounts"
+#~ msgstr "Personen und Konten"
+
+#~ msgid "Can link persons to accounts"
+#~ msgstr "Kann Personen mit Benutzerkonten verknüpfen"
+
+#~ msgid "Enabled custom authentication backends"
+#~ msgstr "Benutzerdefinierte Authentifizierungsbackends aktivieren"
+
+#~ msgid "Link persons to accounts"
+#~ msgstr "Personen mit Benutzerkonten verknüpfen"
+
+#~ msgid ""
+#~ "\n"
+#~ "        You can use this form to assign user accounts to persons. Use the\n"
+#~ "        dropdowns to select existing accounts; use the text fields to create new\n"
+#~ "        accounts on-the-fly. The latter will create a new account with the\n"
+#~ "        entered username and copy all other details from the person.\n"
+#~ "      "
+#~ msgstr ""
+#~ "\n"
+#~ "        Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n"
+#~ "    Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n"
+#~ "    erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n"
+#~ "    eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n"
+#~ "      "
+
+#~ msgid "Update"
+#~ msgstr "Aktualisieren"
+
+#~ msgid "Existing account"
+#~ msgstr "Existierendes Konto"
+
+#~ msgid "New account"
+#~ msgstr "Neues Konto"
+
+#~ msgid "Impersonate user"
+#~ msgstr "Als Benutzer verkleiden"
+
 #~ msgid "Authorized tokens"
 #~ msgstr "Autorisierte Tokens"
 
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
index e10a495775fcb643cbe11cc1ce0daf4c5fc649ef..6bbb636d795adbbe19acdf95ed873b27814d9284 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
@@ -3,32 +3,36 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-08-28 17:53+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"PO-Revision-Date: 2021-10-28 14:37+0000\n"
+"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
+"aleksis-core-js/de/>\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: Weblate 4.8\n"
 
 #: aleksis/core/static/js/main.js:15
 msgid "Today"
-msgstr ""
+msgstr "Heute"
 
 #: aleksis/core/static/js/main.js:16
 msgid "Cancel"
-msgstr ""
+msgstr "Abbrechen"
 
 #: aleksis/core/static/js/main.js:17
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: aleksis/core/static/js/main.js:127
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""
+"Diese Seite enthält vielleicht veraltete Informationen, da es keine "
+"Internetverbindung gibt."
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po
index 1474f2840f186c7492954d6897652557d18f5976..3c118dd9a39119c4615e68b5f729d60de3726bff 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: 2021-06-16 12:00+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n"
@@ -18,25 +18,25 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.4\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 #, fuzzy
 #| msgid "Contact details"
 msgid "Email address"
 msgstr "Détails de contact"
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -80,54 +80,54 @@ msgstr ""
 msgid "Search by contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr "Cet nom est deja en utilisation."
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 #, fuzzy
 #| msgid "Contact details"
 msgid "Contact data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 #, fuzzy
 #| msgid "Contact details"
 msgid "Advanced personal data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr ""
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr "Cet nom est deja en utilisation."
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 #, fuzzy
 #| msgid "Contact details"
 msgid "Common data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 #, fuzzy
@@ -135,24 +135,24 @@ msgstr "Détails de contact"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 #, fuzzy
@@ -160,58 +160,58 @@ msgstr ""
 msgid "Groups"
 msgstr "Groupe"
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 #, fuzzy
 #| msgid "Contact details"
 msgid "Account data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr ""
 
@@ -242,8 +242,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr ""
 
@@ -256,7 +256,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -314,13 +314,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -371,7 +371,7 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -380,593 +380,582 @@ msgid "Group types"
 msgstr "Groupe"
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr ""
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 #, fuzzy
 #| msgid "Contact details"
 msgid "Start date"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr "Personne"
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view photo"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view persons groups"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view personal details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr "Sexe"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr "Description"
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr "groupe"
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view statistics about group."
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr ""
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view system status"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:955
-#, fuzzy
-#| msgid "Contact details"
-msgid "Can link persons to accounts"
-msgstr "Détails de contact"
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view oauth applications"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr ""
 
@@ -1084,75 +1073,71 @@ msgstr ""
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr ""
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr ""
 
@@ -1316,7 +1301,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr ""
 
@@ -2065,33 +2050,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
-msgid "Link persons to accounts"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
-msgstr ""
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
+#, fuzzy
+#| msgid "Contact details"
+msgid "Create person"
+msgstr "Détails de contact"
 
 #: aleksis/core/templates/core/person/edit.html:12
 #: aleksis/core/templates/core/person/edit.html:13
@@ -2099,6 +2064,8 @@ msgid "Edit person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 #, fuzzy
 #| msgid "Contact details"
 msgid "Impersonate"
@@ -2112,12 +2079,6 @@ msgstr "Détails de contact"
 msgid "Children"
 msgstr ""
 
-#: aleksis/core/templates/core/person/list.html:17
-#, fuzzy
-#| msgid "Contact details"
-msgid "Create person"
-msgstr "Détails de contact"
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr ""
@@ -2154,10 +2115,6 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-msgid "Impersonate user"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2514,64 +2471,70 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2836,107 +2799,112 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
+
+#, fuzzy
+#~| msgid "Contact details"
+#~ msgid "Can link persons to accounts"
+#~ msgstr "Détails de contact"
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
index d8b7ad352c6960cdc4dd763358d91f4004435949..bbd51395a6ee28d076da3de7bd4d65b198574194 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index 0badcc66b6e356e9988b64d155b1dfa53ee3381b..c34a5cc0811a09a7a1b1bf4430463e56cff5be3f 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/la/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: 2020-12-19 12:57+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n"
@@ -18,27 +18,27 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.3.2\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Full home postal address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Email address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 #, fuzzy
 #| msgid "Mobile phone"
 msgid "Home and mobile phone"
@@ -86,134 +86,134 @@ msgstr "Quaerere cum breve nomine"
 msgid "Search by contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr ""
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Create a new account"
 msgstr "Personae et computi"
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr ""
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr ""
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr "Anus scolae"
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 #, fuzzy
 #| msgid "Data management"
 msgid "Common data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "personae"
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional data"
 msgstr "addita nomines"
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr "dies"
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr "tempus"
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 msgid "Groups"
 msgstr "Greges"
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr "Scribe nuntium:"
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 #, fuzzy
 #| msgid "Data management"
 msgid "Account data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr ""
 
@@ -246,8 +246,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr "nomen profiteri"
 
@@ -260,7 +260,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -322,13 +322,13 @@ msgstr "Nuntii"
 msgid "Admin"
 msgstr "Administratio"
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -387,7 +387,7 @@ msgstr "Nuntii"
 msgid "People"
 msgstr "Personae"
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -396,14 +396,10 @@ msgid "Group types"
 msgstr "Greges"
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr "Personae et computi"
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 #, fuzzy
@@ -411,614 +407,607 @@ msgstr ""
 msgid "Additional fields"
 msgstr "addita nomines"
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 #, fuzzy
 #| msgid "Edit school term"
 msgid "Linked school term"
 msgstr "Muta anum scolae"
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr "Dies et hora"
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 #, fuzzy
 #| msgid "E-mail address"
 msgid "IP address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr "Nomen"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr "Persona"
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view photo"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view persons groups"
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can view personal details"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr "femininum"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Is person active?"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr "Primus nomen"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 msgid "Short name"
 msgstr "Breve nomen"
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr "Via"
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr "Numerus domini"
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr "Numerus directorius"
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr "Urbs"
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr "Numerus telephoni domi"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr "Genus"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr "Photographia"
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr "Parentes"
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr "Descriptio"
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional field for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional fields for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view statistics about group."
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr ""
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titulus"
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr "Mittens"
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipient"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipients"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget Title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget is broken"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Can edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widgets"
 msgstr "Forum"
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 #, fuzzy
 #| msgid "Icon"
 msgid "Icon URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget order"
 msgstr "Forum"
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget orders"
 msgstr "Forum"
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr "Nota"
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Grex"
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 #, fuzzy
 #| msgid "System status"
 msgid "Can view system status"
 msgstr "Status systemae"
 
-#: aleksis/core/models.py:955
-#, fuzzy
-#| msgid "Persons and accounts"
-msgid "Can link persons to accounts"
-msgstr "Personae et computi"
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 #, fuzzy
 #| msgid "Data management"
 msgid "Can manage data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can impersonate"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view oauth applications"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification sent"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr ""
 
@@ -1144,75 +1133,71 @@ msgstr ""
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr "Officialis nomen scolae, e. g."
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr ""
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr "Britannicus"
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr "Germanus"
 
@@ -1380,7 +1365,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr ""
 
@@ -2169,35 +2154,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
 #, fuzzy
-#| msgid "Persons and accounts"
-msgid "Link persons to accounts"
-msgstr "Personae et computi"
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
-msgstr ""
+#| msgid "Stop impersonation"
+msgid "Create person"
+msgstr "Simulandum aliquem finire"
 
 #: aleksis/core/templates/core/person/edit.html:12
 #: aleksis/core/templates/core/person/edit.html:13
@@ -2205,6 +2168,8 @@ msgid "Edit person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Impersonate"
@@ -2218,12 +2183,6 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
-#: aleksis/core/templates/core/person/list.html:17
-#, fuzzy
-#| msgid "Stop impersonation"
-msgid "Create person"
-msgstr "Simulandum aliquem finire"
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr ""
@@ -2262,12 +2221,6 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-#, fuzzy
-#| msgid "Impersonation"
-msgid "Impersonate user"
-msgstr "Simulare aliquem"
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2637,64 +2590,70 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2959,113 +2918,131 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
+#~ msgid "Persons and accounts"
+#~ msgstr "Personae et computi"
+
+#, fuzzy
+#~| msgid "Persons and accounts"
+#~ msgid "Can link persons to accounts"
+#~ msgstr "Personae et computi"
+
+#, fuzzy
+#~| msgid "Persons and accounts"
+#~ msgid "Link persons to accounts"
+#~ msgstr "Personae et computi"
+
+#, fuzzy
+#~| msgid "Impersonation"
+#~ msgid "Impersonate user"
+#~ msgstr "Simulare aliquem"
+
 #~ msgid "School logo"
 #~ msgstr "Imago scolae"
 
diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
index e10a495775fcb643cbe11cc1ce0daf4c5fc649ef..dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index 8bb678db92f9b2860f4b806ddb7fc40e3a6d9149..ae2f8d194fcacd2bae0d16bb3350dfbaa978aaee 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,23 +17,23 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -75,124 +75,124 @@ msgstr ""
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr ""
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr ""
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr ""
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr ""
 
@@ -223,8 +223,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr ""
 
@@ -237,7 +237,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -295,13 +295,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -352,570 +352,561 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr ""
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr ""
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:955
-msgid "Can link persons to accounts"
-msgstr ""
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 msgid "Can view oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr ""
 
@@ -1027,75 +1018,71 @@ msgstr ""
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr ""
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr ""
 
@@ -1259,7 +1246,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr ""
 
@@ -1996,32 +1983,10 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
-msgid "Link persons to accounts"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
+msgid "Create person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/edit.html:12
@@ -2030,6 +1995,8 @@ msgid "Edit person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 msgid "Impersonate"
 msgstr ""
 
@@ -2041,10 +2008,6 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
-#: aleksis/core/templates/core/person/list.html:17
-msgid "Create person"
-msgstr ""
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr ""
@@ -2081,10 +2044,6 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-msgid "Impersonate user"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2437,64 +2396,70 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2759,108 +2724,108 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
index e10a495775fcb643cbe11cc1ce0daf4c5fc649ef..dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index 1aca6607879e022ab2144b35ec41324db819b2ac..c1f28664922a7b5cbdac80d557c812092765b16f 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,23 +17,23 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
+#: aleksis/core/apps.py:150
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
+#: aleksis/core/apps.py:151
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
+#: aleksis/core/apps.py:152
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
+#: aleksis/core/apps.py:153
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
+#: aleksis/core/apps.py:154
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -75,124 +75,124 @@ msgstr ""
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:62
-msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
-
-#: aleksis/core/forms.py:66
-msgid "This username is already in use."
-msgstr ""
-
-#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
+#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:96
+#: aleksis/core/forms.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:97
+#: aleksis/core/forms.py:48
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:99
+#: aleksis/core/forms.py:50
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:142
+#: aleksis/core/forms.py:93
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:170 aleksis/core/models.py:116
+#: aleksis/core/forms.py:124
+msgid "You cannot set a new username when also selecting an existing user."
+msgstr ""
+
+#: aleksis/core/forms.py:128
+msgid "This username is already in use."
+msgstr ""
+
+#: aleksis/core/forms.py:145 aleksis/core/models.py:117
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:171
+#: aleksis/core/forms.py:146
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
-#: aleksis/core/menus.py:238 aleksis/core/models.py:139
+#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
+#: aleksis/core/menus.py:238 aleksis/core/models.py:140
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:173
+#: aleksis/core/forms.py:148
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:213 aleksis/core/forms.py:216
-#: aleksis/core/models.py:59
+#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
+#: aleksis/core/models.py:60
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:214 aleksis/core/forms.py:217
-#: aleksis/core/models.py:67
+#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
+#: aleksis/core/models.py:68
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
-#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
+#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:144
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:244
+#: aleksis/core/forms.py:219
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:247
+#: aleksis/core/forms.py:222
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:248
+#: aleksis/core/forms.py:223
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:262
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:291
+#: aleksis/core/forms.py:266
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:300
+#: aleksis/core/forms.py:275
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:414
+#: aleksis/core/forms.py:389
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:416
+#: aleksis/core/forms.py:391
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:421
+#: aleksis/core/forms.py:396
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:427
+#: aleksis/core/forms.py:402
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:436
+#: aleksis/core/forms.py:411
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:460
+#: aleksis/core/forms.py:435
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:580
 msgid "No valid selection."
 msgstr ""
 
@@ -223,8 +223,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:20
-#: aleksis/core/templates/two_factor/core/login.html:95
+#: aleksis/core/templates/two_factor/core/login.html:22
+#: aleksis/core/templates/two_factor/core/login.html:76
 msgid "Login"
 msgstr ""
 
@@ -237,7 +237,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:588
+#: aleksis/core/menus.py:32 aleksis/core/models.py:605
 #: aleksis/core/preferences.py:26
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
@@ -295,13 +295,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:687
+#: aleksis/core/menus.py:127 aleksis/core/models.py:704
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:117
+#: aleksis/core/menus.py:138 aleksis/core/models.py:118
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -352,570 +352,561 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:941
+#: aleksis/core/menus.py:260 aleksis/core/models.py:958
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
 #: aleksis/core/menus.py:271
-msgid "Persons and accounts"
-msgstr ""
-
-#: aleksis/core/menus.py:282
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:293 aleksis/core/models.py:429
+#: aleksis/core/menus.py:282 aleksis/core/models.py:446
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:308
+#: aleksis/core/menus.py:297
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:475
+#: aleksis/core/mixins.py:498
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:57
+#: aleksis/core/models.py:58
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:59
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:60
+#: aleksis/core/models.py:61
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:62
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:62 aleksis/core/models.py:185
+#: aleksis/core/models.py:63 aleksis/core/models.py:186
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:63
+#: aleksis/core/models.py:64
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:65
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:66
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:67
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:68
+#: aleksis/core/models.py:69
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:910
+#: aleksis/core/models.py:81 aleksis/core/models.py:927
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:102
+#: aleksis/core/models.py:103
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:109
+#: aleksis/core/models.py:110
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:138 aleksis/core/models.py:859
-#: aleksis/core/templates/core/person/accounts.html:41
+#: aleksis/core/models.py:139 aleksis/core/models.py:876
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:141
+#: aleksis/core/models.py:142
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:144
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:145
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:146
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:164
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:165
+#: aleksis/core/models.py:166
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:174 aleksis/core/models.py:398
+#: aleksis/core/models.py:175 aleksis/core/models.py:415
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:177
+#: aleksis/core/models.py:178
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:179
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:180
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:182
+#: aleksis/core/models.py:183
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:187
+#: aleksis/core/models.py:188
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:189
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:194 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:204 aleksis/core/models.py:546
-#: aleksis/core/models.py:570 aleksis/core/models.py:655
-#: aleksis/core/models.py:934 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:205 aleksis/core/models.py:563
+#: aleksis/core/models.py:587 aleksis/core/models.py:672
+#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:353
+#: aleksis/core/models.py:370
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:355
+#: aleksis/core/models.py:372
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:362
+#: aleksis/core/models.py:379
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:363
+#: aleksis/core/models.py:380
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:397
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/models.py:383
+#: aleksis/core/models.py:400
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:384
+#: aleksis/core/models.py:401
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:413
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:406 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:409 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:416 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:424
+#: aleksis/core/models.py:441
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:559
 msgid "User"
 msgstr ""
 
-#: aleksis/core/models.py:545 aleksis/core/models.py:569
-#: aleksis/core/models.py:654
+#: aleksis/core/models.py:562 aleksis/core/models.py:586
+#: aleksis/core/models.py:671
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:548
+#: aleksis/core/models.py:565
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:554
+#: aleksis/core/models.py:571
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:555
+#: aleksis/core/models.py:572
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:561
+#: aleksis/core/models.py:578
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:566
+#: aleksis/core/models.py:583
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:571 aleksis/core/models.py:911
+#: aleksis/core/models.py:588 aleksis/core/models.py:928
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:573
+#: aleksis/core/models.py:590
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:574
+#: aleksis/core/models.py:591
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:604
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:656
+#: aleksis/core/models.py:673
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:659
+#: aleksis/core/models.py:676
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:662
+#: aleksis/core/models.py:679
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:686
+#: aleksis/core/models.py:703
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:724
+#: aleksis/core/models.py:741
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:742
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:780
+#: aleksis/core/models.py:797
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:781
+#: aleksis/core/models.py:798
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:782
+#: aleksis/core/models.py:799
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:785
+#: aleksis/core/models.py:802
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:786
+#: aleksis/core/models.py:803
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:791
+#: aleksis/core/models.py:808
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:792
+#: aleksis/core/models.py:809
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:814
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:815
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:820
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:804
+#: aleksis/core/models.py:821
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:835
+#: aleksis/core/models.py:852
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:853
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:854
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:860
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:861
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:867
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:851
+#: aleksis/core/models.py:868
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:856
+#: aleksis/core/models.py:873
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:878
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:862
+#: aleksis/core/models.py:879
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:894
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:895
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:901
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:897
+#: aleksis/core/models.py:914
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:898
+#: aleksis/core/models.py:915
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:908
+#: aleksis/core/models.py:925
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:912
+#: aleksis/core/models.py:929
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:935
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:919
+#: aleksis/core/models.py:936
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:933
+#: aleksis/core/models.py:950
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:940 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:954
+#: aleksis/core/models.py:971
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:955
-msgid "Can link persons to accounts"
-msgstr ""
-
-#: aleksis/core/models.py:956
+#: aleksis/core/models.py:972
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:973
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:974
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:975
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:960
+#: aleksis/core/models.py:976
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:961
+#: aleksis/core/models.py:977
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:962
+#: aleksis/core/models.py:978
 msgid "Can add oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:963
+#: aleksis/core/models.py:979
 msgid "Can list oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:964
+#: aleksis/core/models.py:980
 msgid "Can view oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:965
+#: aleksis/core/models.py:981
 msgid "Can update oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:966
+#: aleksis/core/models.py:982
 msgid "Can delete oauth applications"
 msgstr ""
 
-#: aleksis/core/models.py:967
+#: aleksis/core/models.py:983
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1003
+#: aleksis/core/models.py:1019
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1027
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1012
+#: aleksis/core/models.py:1028
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1025
+#: aleksis/core/models.py:1041
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1026
+#: aleksis/core/models.py:1042
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1045
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1048
+#: aleksis/core/models.py:1064
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1050
+#: aleksis/core/models.py:1066
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1052
+#: aleksis/core/models.py:1068
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1075
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1081
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1080
+#: aleksis/core/models.py:1096
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task user assignments"
 msgstr ""
 
@@ -1027,75 +1018,71 @@ msgstr ""
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
-msgid "Enabled custom authentication backends"
-msgstr ""
-
-#: aleksis/core/preferences.py:268
+#: aleksis/core/preferences.py:254
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:276
+#: aleksis/core/preferences.py:262
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:287
+#: aleksis/core/preferences.py:273
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:299
+#: aleksis/core/preferences.py:285
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:310
+#: aleksis/core/preferences.py:296
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:321
+#: aleksis/core/preferences.py:307
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:330
+#: aleksis/core/preferences.py:316
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:339
+#: aleksis/core/preferences.py:325
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:336
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:364
+#: aleksis/core/preferences.py:350
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:377
+#: aleksis/core/preferences.py:363
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:387
+#: aleksis/core/preferences.py:373
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:374
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:398
+#: aleksis/core/preferences.py:384
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:408
+#: aleksis/core/preferences.py:394
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:468
+#: aleksis/core/settings.py:452
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:469
+#: aleksis/core/settings.py:453
 msgid "German"
 msgstr ""
 
@@ -1259,7 +1246,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:100
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid "Reset password"
 msgstr ""
 
@@ -1996,32 +1983,10 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/core/person/accounts.html:12
-#: aleksis/core/templates/core/person/accounts.html:14
-msgid "Link persons to accounts"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:21
-msgid ""
-"\n"
-"        You can use this form to assign user accounts to persons. Use the\n"
-"        dropdowns to select existing accounts; use the text fields to create new\n"
-"        accounts on-the-fly. The latter will create a new account with the\n"
-"        entered username and copy all other details from the person.\n"
-"      "
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:36
-#: aleksis/core/templates/core/person/accounts.html:60
-msgid "Update"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:42
-msgid "Existing account"
-msgstr ""
-
-#: aleksis/core/templates/core/person/accounts.html:43
-msgid "New account"
+#: aleksis/core/templates/core/person/create.html:12
+#: aleksis/core/templates/core/person/create.html:13
+#: aleksis/core/templates/core/person/list.html:17
+msgid "Create person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/edit.html:12
@@ -2030,6 +1995,8 @@ msgid "Edit person"
 msgstr ""
 
 #: aleksis/core/templates/core/person/full.html:44
+#: aleksis/core/templates/impersonate/list_users.html:7
+#: aleksis/core/templates/impersonate/list_users.html:8
 msgid "Impersonate"
 msgstr ""
 
@@ -2041,10 +2008,6 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
-#: aleksis/core/templates/core/person/list.html:17
-msgid "Create person"
-msgstr ""
-
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
 msgstr ""
@@ -2081,10 +2044,6 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/impersonate/list_users.html:8
-msgid "Impersonate user"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
 #: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
 msgid "Delete application"
@@ -2437,64 +2396,70 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:18
+#: aleksis/core/templates/two_factor/core/login.html:20
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:26
-msgid "You have no permission to view this page. Please login with an other account."
+#: aleksis/core/templates/two_factor/core/login.html:28
+msgid ""
+"You have no permission to view this page. Please login with an other\n"
+"                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:33
+#: aleksis/core/templates/two_factor/core/login.html:36
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:43
+#: aleksis/core/templates/two_factor/core/login.html:46
 msgid ""
 "\n"
-"                      We are calling your phone right now, please enter the\n"
-"                      digits you hear.\n"
-"                    "
+"                        We are calling your phone right now, please enter the\n"
+"                        digits you hear.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:48
+#: aleksis/core/templates/two_factor/core/login.html:51
 msgid ""
 "\n"
-"                      We sent you a text message, please enter the tokens we\n"
-"                      sent.\n"
-"                    "
+"                        We sent you a text message, please enter the tokens we\n"
+"                        sent.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:53
+#: aleksis/core/templates/two_factor/core/login.html:56
 msgid ""
 "\n"
-"                      Please enter the tokens generated by your token\n"
-"                      generator.\n"
-"                    "
+"                        Please enter the tokens generated by your token\n"
+"                        generator.\n"
+"                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:59
+#: aleksis/core/templates/two_factor/core/login.html:62
 msgid ""
 "\n"
-"                    Use this form for entering backup tokens for logging in.\n"
-"                    These tokens have been generated for you to print and keep safe. Please\n"
-"                    enter one of these backup tokens to login to your account.\n"
-"                  "
+"                      Use this form for entering backup tokens for logging in.\n"
+"                      These tokens have been generated for you to print and keep safe. Please\n"
+"                      enter one of these backup tokens to login to your account.\n"
+"                    "
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:90
+msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:74
+#: aleksis/core/templates/two_factor/core/login.html:92
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:84
+#: aleksis/core/templates/two_factor/core/login.html:102
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:87
+#: aleksis/core/templates/two_factor/core/login.html:105
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:110
+#: aleksis/core/templates/two_factor/core/login.html:116
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2759,107 +2724,107 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:253
+#: aleksis/core/views.py:251
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:265
+#: aleksis/core/views.py:263
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:410
+#: aleksis/core/views.py:387
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:471
+#: aleksis/core/views.py:406 aleksis/core/views.py:416
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:510
+#: aleksis/core/views.py:466
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:607
+#: aleksis/core/views.py:563
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:623
+#: aleksis/core/views.py:579
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:707
+#: aleksis/core/views.py:663
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:687
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:745
+#: aleksis/core/views.py:701
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:777
+#: aleksis/core/views.py:733
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:811
+#: aleksis/core/views.py:767
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:836
+#: aleksis/core/views.py:792
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:866
+#: aleksis/core/views.py:822
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:899
+#: aleksis/core/views.py:855
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:900
+#: aleksis/core/views.py:856
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:901
+#: aleksis/core/views.py:857
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:902
+#: aleksis/core/views.py:858
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:918
+#: aleksis/core/views.py:874
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:960
+#: aleksis/core/views.py:916
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:990
+#: aleksis/core/views.py:946
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:1000
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1067
+#: aleksis/core/views.py:1023
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1069
+#: aleksis/core/views.py:1025
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1197
+#: aleksis/core/views.py:1153
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1204
+#: aleksis/core/views.py:1160
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
index e10a495775fcb643cbe11cc1ce0daf4c5fc649ef..dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-10-28 16:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/managers.py b/aleksis/core/managers.py
index ade623230aff2b8663e976ae4c133c3e24b979b4..aed4cab72d4b0cd53d3544b20f0180a7087dfd2c 100644
--- a/aleksis/core/managers.py
+++ b/aleksis/core/managers.py
@@ -120,3 +120,7 @@ class InstalledWidgetsDashboardWidgetOrderManager(Manager):
 
         # [obj["id"] for obj in list(Person.objects.all().values("id"))]
         return super().get_queryset().filter(widget_id__in=dashboard_widget_pks)
+
+
+class PolymorphicCurrentSiteManager(_CurrentSiteManager, PolymorphicManager):
+    """Default manager for extensible, polymorphic models."""
diff --git a/aleksis/core/menus.py b/aleksis/core/menus.py
index b368a6c702e4b2514afc903fb5ff48417ef22bfa..d9fd84b0f78a1ce141537725d233f57b43a4fbea 100644
--- a/aleksis/core/menus.py
+++ b/aleksis/core/menus.py
@@ -267,17 +267,6 @@ MENUS = {
                         )
                     ],
                 },
-                {
-                    "name": _("Persons and accounts"),
-                    "url": "persons_accounts",
-                    "icon": "person_add",
-                    "validators": [
-                        (
-                            "aleksis.core.util.predicates.permission_validator",
-                            "core.link_persons_accounts_rule",
-                        )
-                    ],
-                },
                 {
                     "name": _("Groups and child groups"),
                     "url": "groups_child_groups",
diff --git a/aleksis/core/migrations/0021_drop_persons_accounts_perm.py b/aleksis/core/migrations/0021_drop_persons_accounts_perm.py
new file mode 100644
index 0000000000000000000000000000000000000000..576efcec16e706a27059d80d9c256052c0e74dab
--- /dev/null
+++ b/aleksis/core/migrations/0021_drop_persons_accounts_perm.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.2.8 on 2021-10-24 13:43
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0020_pdf_file_person_optional'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='globalpermissions',
+            options={'default_permissions': (), 'managed': False, 'permissions': (('view_system_status', 'Can view system status'), ('manage_data', 'Can manage data'), ('impersonate', 'Can impersonate'), ('search', 'Can use search'), ('change_site_preferences', 'Can change site preferences'), ('change_person_preferences', 'Can change person preferences'), ('change_group_preferences', 'Can change group preferences'), ('add_oauth_applications', 'Can add oauth applications'), ('list_oauth_applications', 'Can list oauth applications'), ('view_oauth_applications', 'Can view oauth applications'), ('update_oauth_applications', 'Can update oauth applications'), ('delete_oauth_applications', 'Can delete oauth applications'), ('test_pdf', 'Can test PDF generation'))},
+        ),
+    ]
diff --git a/aleksis/core/migrations/0022_public_favicon.py b/aleksis/core/migrations/0022_public_favicon.py
new file mode 100644
index 0000000000000000000000000000000000000000..13864fdaebfb1811ac7629ed891c745595afc5bc
--- /dev/null
+++ b/aleksis/core/migrations/0022_public_favicon.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.4 on 2021-07-24 13:14
+import os
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0021_drop_persons_accounts_perm'),
+        ('favicon', '0004_faviconimg_favicon_size_rel_unique'),
+    ]
+
+    def _migrate_favicons(apps, schema_editor):
+        FaviconImg = apps.get_model('favicon', "FaviconImg")
+        for favicon_img in FaviconImg.objects.all():
+            old_name = favicon_img.faviconImage.name
+            new_name = os.path.join("public", old_name)
+            storage = favicon_img.faviconImage.storage
+            if storage.exists(old_name):
+                storage.save(new_name, favicon_img.faviconImage.file)
+                favicon_img.faviconImage.name = new_name
+                favicon_img.save()
+
+    operations = [
+        migrations.RunPython(_migrate_favicons)
+    ]
diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index fa6c4fa29a67ec2904e42dba173ce72575c0e6ba..1e4fd42168f66d4ca986dca670f277ead0cbf3e7 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -24,9 +24,16 @@ from guardian.admin import GuardedModelAdmin
 from guardian.core import ObjectPermissionChecker
 from jsonstore.fields import IntegerField, JSONFieldMixin
 from material.base import Layout, LayoutNode
+from polymorphic.base import PolymorphicModelBase
+from polymorphic.managers import PolymorphicManager
+from polymorphic.models import PolymorphicModel
 from rules.contrib.admin import ObjectPermissionsModelAdmin
 
-from aleksis.core.managers import CurrentSiteManagerWithoutMigrations, SchoolTermRelatedQuerySet
+from aleksis.core.managers import (
+    CurrentSiteManagerWithoutMigrations,
+    PolymorphicCurrentSiteManager,
+    SchoolTermRelatedQuerySet,
+)
 
 
 class _ExtensibleModelBase(models.base.ModelBase):
@@ -351,6 +358,22 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
         abstract = True
 
 
+class _ExtensiblePolymorphicModelBase(_ExtensibleModelBase, PolymorphicModelBase):
+    """Base class for extensible, polymorphic models."""
+
+
+class ExtensiblePolymorphicModel(
+    ExtensibleModel, PolymorphicModel, metaclass=_ExtensiblePolymorphicModelBase
+):
+    """Model class for extensible, polymorphic models."""
+
+    objects = PolymorphicCurrentSiteManager()
+    objects_all_sites = PolymorphicManager()
+
+    class Meta:
+        abstract = True
+
+
 class PureDjangoModel(object):
     """No-op mixin to mark a model as deliberately not using ExtensibleModel."""
 
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 8fffbe122638eebee19e199914ce0b7edbc91837..1264b645ef56da31c215f3b42b0e59162935b6a0 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -32,6 +32,7 @@ from model_utils import FieldTracker
 from model_utils.models import TimeStampedModel
 from phonenumber_field.modelfields import PhoneNumberField
 from polymorphic.models import PolymorphicModel
+from templated_email import send_templated_mail
 
 from aleksis.core.data_checks import BrokenDashboardWidgetDataCheck, DataCheck, DataCheckRegistry
 
@@ -329,6 +330,22 @@ class Person(ExtensibleModel):
             if force or not self.primary_group:
                 self.primary_group = self.member_of.filter(**{f"{field}__regex": pattern}).first()
 
+    def notify_about_changed_data(
+        self, changed_fields: Iterable[str], recipients: Optional[List[str]] = None
+    ):
+        """Notify (configured) recipients about changed data of this person."""
+        context = {"person": self, "changed_fields": changed_fields}
+        recipients = recipients or [
+            get_site_preferences()["account__person_change_notification_contact"]
+        ]
+        send_templated_mail(
+            template_name="person_changed",
+            from_email=self.mail_sender_via,
+            headers={"Reply-To": self.mail_sender, "Sender": self.mail_sender,},
+            recipient_list=recipients,
+            context=context,
+        )
+
 
 class DummyPerson(Person):
     """A dummy person that is not stored into the database.
@@ -952,7 +969,6 @@ class GlobalPermissions(GlobalPermissionModel):
     class Meta(GlobalPermissionModel.Meta):
         permissions = (
             ("view_system_status", _("Can view system status")),
-            ("link_persons_accounts", _("Can link persons to accounts")),
             ("manage_data", _("Can manage data")),
             ("impersonate", _("Can impersonate")),
             ("search", _("Can use search")),
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index 588992f60d4e396450b05fc7d4a9e2978f196a45..6faaadf7dc93ad182fc48325a34a2b94f9eab392 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -246,20 +246,6 @@ class SchoolNameOfficial(StringPreference):
     verbose_name = _("Official name of the school, e.g. as given by supervisory authority")
 
 
-@site_preferences_registry.register
-class AuthenticationBackends(MultipleChoicePreference):
-    """Authentication backends of your AlekSIS instance."""
-
-    section = auth
-    name = "backends"
-    default = None
-    verbose_name = _("Enabled custom authentication backends")
-    field_attribute = {"initial": []}
-
-    def get_choices(self):
-        return [(b, b) for b in settings.CUSTOM_AUTHENTICATION_BACKENDS]
-
-
 @site_preferences_registry.register
 class AllowPasswordChange(BooleanPreference):
     section = auth
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index 9b8f7cc1f3c9aafcbb91a5ed06685d33e15db7d5..e8e5443e15396554befa1f14c2536c66231c76cf 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -2,7 +2,6 @@ import rules
 
 from .models import AdditionalField, Announcement, Group, GroupType, Person
 from .util.predicates import (
-    contains_site_preference_value,
     has_any_object,
     has_global_perm,
     has_object_perm,
@@ -80,10 +79,6 @@ delete_person_predicate = has_person & (
 )
 rules.add_perm("core.delete_person_rule", delete_person_predicate)
 
-# Link persons with accounts
-link_persons_accounts_predicate = has_person & has_global_perm("core.link_persons_accounts")
-rules.add_perm("core.link_persons_accounts_rule", link_persons_accounts_predicate)
-
 # View groups
 view_groups_predicate = has_person & (
     has_global_perm("core.view_group") | has_any_object("core.view_group", Group)
@@ -158,12 +153,7 @@ rules.add_perm("core.view_system_status_rule", view_system_status_predicate)
 rules.add_perm(
     "core.view_people_menu_rule",
     has_person
-    & (
-        view_persons_predicate
-        | view_groups_predicate
-        | link_persons_accounts_predicate
-        | assign_child_groups_to_groups_predicate
-    ),
+    & (view_persons_predicate | view_groups_predicate | assign_child_groups_to_groups_predicate),
 )
 
 # View person personal details
@@ -350,15 +340,3 @@ rules.add_perm("core.upload_files_ckeditor_rule", upload_files_ckeditor_predicat
 
 test_pdf_generation_predicate = has_person & has_global_perm("core.test_pdf")
 rules.add_perm("core.test_pdf_rule", test_pdf_generation_predicate)
-
-# Generate rules for syncable fields
-for field in Person._meta.fields:
-    perm = (
-        has_global_perm("core.edit_person")
-        | has_object_perm("core.edit_person")
-        | (
-            is_current_person
-            & contains_site_preference_value("account", "editable_fields_person", field.name)
-        )
-    )
-    rules.add_perm(f"core.change_person_field_{field.name}_rule", perm)
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index a41b1913c9ea41bef202897c3555722e14605516..10ce06dbbd1de00294ad6f1ac15eab4d7fe54695 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -338,16 +338,6 @@ if _settings.get("oauth2.oidc.enabled", False):
             #        "OIDC_ISS_ENDPOINT": _settings.get("oauth2.oidc.issuer_name", "example.com"),
         }
     )
-    OAUTH2_PROVIDER["SCOPES"].update(
-        {
-            "openid": _("OpenID Connect scope"),
-            "profile": _("Given name, family name, link to profile and picture if existing."),
-            "address": _("Full home postal address"),
-            "email": _("Email address"),
-            "phone": _("Home and mobile phone"),
-            "groups": _("Groups"),
-        }
-    )
 
 # Configuration for REST framework
 REST_FRAMEWORK = {
@@ -448,9 +438,6 @@ if _settings.get("ldap.uri", None):
                 "is_superuser"
             ]
 
-CUSTOM_AUTHENTICATION_BACKENDS = []
-merge_app_settings("AUTHENTICATION_BACKENDS", CUSTOM_AUTHENTICATION_BACKENDS)
-
 # Add ModelBckend last so all other backends get a chance
 # to verify passwords first
 AUTHENTICATION_BACKENDS.append("django.contrib.auth.backends.ModelBackend")
@@ -458,10 +445,6 @@ AUTHENTICATION_BACKENDS.append("django.contrib.auth.backends.ModelBackend")
 # Authentication backend for django-allauth.
 AUTHENTICATION_BACKENDS.append("allauth.account.auth_backends.AuthenticationBackend")
 
-# Structure of items: backend, URL name, icon name, button title
-ALTERNATIVE_LOGIN_VIEWS = []
-merge_app_settings("ALTERNATIVE_LOGIN_VIEWS", ALTERNATIVE_LOGIN_VIEWS, True)
-
 # Internationalization
 # https://docs.djangoproject.com/en/2.1/topics/i18n/
 
@@ -540,15 +523,14 @@ SASS_PROCESSOR_CUSTOM_FUNCTIONS = {
     "get-preference": "aleksis.core.util.sass_helpers.get_preference",
 }
 SASS_PROCESSOR_INCLUDE_DIRS = [
-    _settings.get("materialize.sass_path", JS_ROOT + "/materialize-css/sass/"),
-    STATIC_ROOT + "/materialize-css/sass/",
-    STATIC_ROOT,
+    _settings.get("materialize.sass_path", os.path.join(JS_ROOT, "materialize-css", "sass")),
+    os.path.join(STATIC_ROOT, "public"),
 ]
 
-ADMINS = _settings.get("contact.admins", [])
-SERVER_EMAIL = _settings.get("contact.from", "root@localhost")
-DEFAULT_FROM_EMAIL = _settings.get("contact.from", "root@localhost")
-MANAGERS = _settings.get("contact.admins", [])
+ADMINS = _settings.get("contact.admins", [AUTH_INITIAL_SUPERUSER["email"]])
+SERVER_EMAIL = _settings.get("contact.from", ADMINS[0])
+DEFAULT_FROM_EMAIL = _settings.get("contact.from", ADMINS[0])
+MANAGERS = _settings.get("contact.admins", ADMINS)
 
 if _settings.get("mail.server.host", None):
     EMAIL_HOST = _settings.get("mail.server.host")
@@ -653,6 +635,7 @@ PWA_ICONS_CONFIG = {
     "apple_splash": [192],
     "microsoft": [144],
 }
+FAVICON_PATH = os.path.join("public", "favicon")
 
 SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "js", "serviceworker.js")
 
diff --git a/aleksis/core/static/materialize.scss b/aleksis/core/static/public/materialize-custom.scss
similarity index 100%
rename from aleksis/core/static/materialize.scss
rename to aleksis/core/static/public/materialize-custom.scss
diff --git a/aleksis/core/static/style.scss b/aleksis/core/static/public/style.scss
similarity index 98%
rename from aleksis/core/static/style.scss
rename to aleksis/core/static/public/style.scss
index ab20ec56d066fa3d6ed7637a8cdf38bb105b0f21..c2aa516e8cfcf88190aa13f43cc8f6aad5d747de 100644
--- a/aleksis/core/static/style.scss
+++ b/aleksis/core/static/public/style.scss
@@ -1,4 +1,4 @@
-@import "materialize";
+@import "materialize-custom";
 
 .primary-color {
   background-color: $primary-color !important;
@@ -87,12 +87,6 @@ header, main, footer {
   width: auto;
 }
 
-@media only screen and (max-width: 993px) {
-  header div.nav-wrapper {
-    z-index: -5;
-  }
-}
-
 
 /********/
 /* MAIN */
diff --git a/aleksis/core/static/theme.scss b/aleksis/core/static/public/theme.scss
similarity index 100%
rename from aleksis/core/static/theme.scss
rename to aleksis/core/static/public/theme.scss
diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index 23f4060e5d3f5735023b9f5b7a307bb665582907..80e6ee8d7cae0837b1c6b91ce4b258bd2608f22b 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -24,7 +24,7 @@
   {% include_css "Roboto500" %}
   {% include_css "Roboto700" %}
   {% include_css "Roboto900" %}
-  <link rel="stylesheet" href="{% sass_src 'style.scss' %}">
+  <link rel="stylesheet" href="{% sass_src 'public/style.scss' %}">
 
   {# Add JS URL resolver #}
   <script src="{% url "js_reverse" %}" type="text/javascript"></script>
diff --git a/aleksis/core/templates/core/base_print.html b/aleksis/core/templates/core/base_print.html
index 7691cdf804b043b373e6a4f26802fc9cdb732205..428d28f2858406c771b635c20ff874bf5c9f9d5a 100644
--- a/aleksis/core/templates/core/base_print.html
+++ b/aleksis/core/templates/core/base_print.html
@@ -22,7 +22,7 @@
   {% include_css "Roboto700" %}
   {% include_css "Roboto900" %}
   {% include_css "paper-css" %}
-  <link rel="stylesheet" href="{% sass_src 'style.scss' %}"/>
+  <link rel="stylesheet" href="{% sass_src 'public/style.scss' %}"/>
   <link rel="stylesheet" href="{% static "print.css" %}"/>
   {% if landscape %}
     <link rel="stylesheet" href="{% static 'print_landscape.css' %}"/>
diff --git a/aleksis/core/templates/core/person/accounts.html b/aleksis/core/templates/core/person/accounts.html
deleted file mode 100644
index 03725518dfcbf8552a53199790daa44d541bac32..0000000000000000000000000000000000000000
--- a/aleksis/core/templates/core/person/accounts.html
+++ /dev/null
@@ -1,65 +0,0 @@
-{# -*- engine:django -*- #}
-
-{% extends "core/base.html" %}
-
-{% load i18n any_js %}
-
-{% block extra_head %}
-  {{ persons_accounts_formset.media.css }}
-  {% include_css "select2-materialize" %}
-{% endblock %}
-
-{% block browser_title %}{% blocktrans %}Link persons to accounts{% endblocktrans %}{% endblock %}
-{% block page_title %}
-  {% blocktrans %}Link persons to accounts{% endblocktrans %}
-{% endblock %}
-
-{% block content %}
-  <div class="alert info">
-    <p>
-      <i class="material-icons left">info</i>
-      {% blocktrans %}
-        You can use this form to assign user accounts to persons. Use the
-        dropdowns to select existing accounts; use the text fields to create new
-        accounts on-the-fly. The latter will create a new account with the
-        entered username and copy all other details from the person.
-      {% endblocktrans %}
-    </p>
-  </div>
-
-  <form method="post">
-    {% csrf_token %}
-    {{ persons_accounts_formset.management_form }}
-
-    <button type="submit" class="btn green waves-effect waves-light">
-      <i class="material-icons left">save</i>
-      {% blocktrans %}Update{% endblocktrans %}
-    </button>
-
-    <table>
-      <tr>
-        <th>{% blocktrans %}Person{% endblocktrans %}</th>
-        <th>{% blocktrans %}Existing account{% endblocktrans %}</th>
-        <th>{% blocktrans %}New account{% endblocktrans %}</th>
-      </tr>
-      {% for form in persons_accounts_formset %}
-        {{ form.id }}
-        <tr>
-          <td>
-            {{ form.last_name }}
-            {{ form.first_name }}
-          </td>
-          <td>{{ form.user }}</td>
-          <td>{{ form.new_user }}</td>
-        </tr>
-      {% endfor %}
-    </table>
-
-    <button type="submit" class="btn green waves-effect waves-light">
-      <i class="material-icons left">save</i>
-      {% blocktrans %}Update{% endblocktrans %}
-    </button>
-  </form>
-  {% include_js "select2-materialize" %}
-  {{ persons_accounts_formset.media.js }}
-{% endblock %}
diff --git a/aleksis/core/templates/core/person/create.html b/aleksis/core/templates/core/person/create.html
new file mode 100644
index 0000000000000000000000000000000000000000..08a6639e05e45f82912fd3e4adb25021264010c9
--- /dev/null
+++ b/aleksis/core/templates/core/person/create.html
@@ -0,0 +1,24 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+
+{% load material_form i18n any_js %}
+
+{% block extra_head %}
+  {{ form.media.css }}
+  {% include_css "select2-materialize" %}
+{% endblock %}
+
+{% block browser_title %}{% blocktrans %}Create person{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Create person{% endblocktrans %}{% endblock %}
+
+
+{% block content %}
+  <form method="post" enctype="multipart/form-data">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+  {% include_js "select2-materialize" %}
+  {{ form.media.js }}
+{% endblock %}
diff --git a/aleksis/core/templates/core/person/edit.html b/aleksis/core/templates/core/person/edit.html
index 3bf16ca3521ea744acfe48c6829dfae21db06eb5..788721c3541cba056c1ef05214eb0c39eb1b6f69 100644
--- a/aleksis/core/templates/core/person/edit.html
+++ b/aleksis/core/templates/core/person/edit.html
@@ -5,7 +5,7 @@
 {% load material_form i18n any_js %}
 
 {% block extra_head %}
-  {{ edit_person_form.media }}
+  {{ form.media.css }}
   {% include_css "select2-materialize" %}
 {% endblock %}
 
@@ -14,13 +14,11 @@
 
 
 {% block content %}
-
   <form method="post" enctype="multipart/form-data">
     {% csrf_token %}
-    {% form form=edit_person_form %}{% endform %}
+    {% form form=form %}{% endform %}
     {% include "core/partials/save_button.html" %}
   </form>
   {% include_js "select2-materialize" %}
-  {{ edit_group_form.media.js }}
-
+  {{ form.media.js }}
 {% endblock %}
diff --git a/aleksis/core/templates/impersonate/list_users.html b/aleksis/core/templates/impersonate/list_users.html
index aff2f8660ac374cebb1bbeff646bc038aee9e5f1..fd273ca60902e5defbc41e567a9205cfe99fb349 100644
--- a/aleksis/core/templates/impersonate/list_users.html
+++ b/aleksis/core/templates/impersonate/list_users.html
@@ -4,9 +4,8 @@
 {% extends "core/base.html" %}
 {% load i18n %}
 
-{% block page_title %}
-  {% blocktrans %}Impersonate user{% endblocktrans %}
-{% endblock %}
+{% block browser_title %}{% trans "Impersonate" %}{% endblock %}
+{% block page_title %}{% trans "Impersonate" %}{% endblock %}
 
 {% block content %}
   {% if page.object_list %}
diff --git a/aleksis/core/templates/templated_email/person_changed.email b/aleksis/core/templates/templated_email/person_changed.email
index 2e1db653256873d3f72afcd34a1e19914d116480..1e0d8be25684486bfdceac0b979b461253c21df7 100644
--- a/aleksis/core/templates/templated_email/person_changed.email
+++ b/aleksis/core/templates/templated_email/person_changed.email
@@ -11,7 +11,7 @@
    the person {{ person }} recently changed the following fields:
  {% endblocktrans %}
 
- {% for field in send_notification_fields %}
+ {% for field in changed_fields %}
   * {{ field }}
  {% endfor %}
 {% endblock %}
@@ -25,7 +25,7 @@
  </p>
 
  <ul>
-  {% for field in send_notification_fields %}
+  {% for field in changed_fields %}
    <li>{{ field }}</li>
   {% endfor %}
  </ul>
diff --git a/aleksis/core/templates/two_factor/core/login.html b/aleksis/core/templates/two_factor/core/login.html
index 470aa879de8a6ffde5c15765b6375bc072ee4a79..9ea4bc6c24b7d9e764742bbddf75ceb86b785868 100644
--- a/aleksis/core/templates/two_factor/core/login.html
+++ b/aleksis/core/templates/two_factor/core/login.html
@@ -9,110 +9,118 @@
 {% block content %}
   {% get_providers as socialaccount_providers %}
 
-  <div class="row">
-    <div class="col m1 l2 xl3"></div>
-    <div class="col s12 m10 l8 xl6">
-      <div class="card">
-        <div class="card-content">
-          {% if wizard.steps.current == 'auth' and socialaccount_providers %}
-            <div class="card-title">{% trans "Login with username and password" %}</div>
-          {% else %}
-            <div class="card-title">{% trans "Login" %}</div>
-          {% endif %}
-          {% if wizard.steps.current == "auth" and user.is_authenticated %}
-            <div class="alert warning">
-              <p>
-                <i class="material-icons left">warning</i>
-                {% blocktrans %}You have no permission to view this page. Please login with an other account.{% endblocktrans %}
-              </p>
-            </div>
-          {% elif wizard.steps.current == 'auth' %}
-          <div class="alert primary">
-            <p>
-              <i class="material-icons left">info</i>
-              {% blocktrans %}Please login to see this page.{% endblocktrans %}
-            </p>
-          </div>
-          {% endif %}
-          {% if not  wizard.steps.current == "auth" %}
-            <div class="alert primary">
-              <p>
-                <i class="material-icons left">info</i>
-                {% if wizard.steps.current == 'token' %}
-                  {% if device.method == 'call' %}
-                    {% blocktrans %}
-                      We are calling your phone right now, please enter the
-                      digits you hear.
-                    {% endblocktrans %}
-                  {% elif device.method == 'sms' %}
-                    {% blocktrans %}
-                      We sent you a text message, please enter the tokens we
-                      sent.
-                    {% endblocktrans %}
-                  {% else %}
+  <form action="" method="post">
+    {% csrf_token %}
+    <div class="row">
+      <div class="col m1 l2 xl3"></div>
+      <div class="col s12 m10 l8 xl6">
+        <div class="card">
+          <div class="card-content">
+            {% if wizard.steps.current == 'auth' and socialaccount_providers %}
+              <div class="card-title">{% trans "Login with username and password" %}</div>
+            {% else %}
+              <div class="card-title">{% trans "Login" %}</div>
+            {% endif %}
+            {% if wizard.steps.current == "auth" and user.is_authenticated %}
+              <div class="alert warning">
+                <p>
+                  <i class="material-icons left">warning</i>
+                  {% blocktrans %}You have no permission to view this page. Please login with an other
+                    account.{% endblocktrans %}
+                </p>
+              </div>
+            {% elif wizard.steps.current == 'auth' %}
+              <div class="alert primary">
+                <p>
+                  <i class="material-icons left">info</i>
+                  {% blocktrans %}Please login to see this page.{% endblocktrans %}
+                </p>
+              </div>
+            {% endif %}
+            {% if not wizard.steps.current == "auth" %}
+              <div class="alert primary">
+                <p>
+                  <i class="material-icons left">info</i>
+                  {% if wizard.steps.current == 'token' %}
+                    {% if device.method == 'call' %}
+                      {% blocktrans %}
+                        We are calling your phone right now, please enter the
+                        digits you hear.
+                      {% endblocktrans %}
+                    {% elif device.method == 'sms' %}
+                      {% blocktrans %}
+                        We sent you a text message, please enter the tokens we
+                        sent.
+                      {% endblocktrans %}
+                    {% else %}
+                      {% blocktrans %}
+                        Please enter the tokens generated by your token
+                        generator.
+                      {% endblocktrans %}
+                    {% endif %}
+                  {% elif wizard.steps.current == 'backup' %}
                     {% blocktrans %}
-                      Please enter the tokens generated by your token
-                      generator.
+                      Use this form for entering backup tokens for logging in.
+                      These tokens have been generated for you to print and keep safe. Please
+                      enter one of these backup tokens to login to your account.
                     {% endblocktrans %}
                   {% endif %}
-                {% elif wizard.steps.current == 'backup' %}
-                  {% blocktrans %}
-                    Use this form for entering backup tokens for logging in.
-                    These tokens have been generated for you to print and keep safe. Please
-                    enter one of these backup tokens to login to your account.
-                  {% endblocktrans %}
-                {% endif %}
-              </p>
-            </div>
-          {% endif %}
+                </p>
+              </div>
+            {% endif %}
 
-          <form id="login_form" action="" method="post">
-            {% csrf_token %}
             {% include "two_factor/_wizard_forms.html" %}
-
-            {% if other_devices %}
-              <p>{% trans "Or, alternatively, use one of your backup phones:" %}</p>
-              <p>
-                {% for other in other_devices %}
-                  <button name="challenge_device" value="{{ other.persistent_id }}" class="btn" type="submit">
-                    {{ other|device_action }}
-                  </button>
-                {% endfor %}
-              </p>
-            {% endif %}
-            {% if backup_tokens %}
-              <p>{% trans "As a last resort, you can use a backup token:" %}</p>
-              <p>
-                <button name="wizard_goto_step" type="submit" value="backup" class="btn">
-                  {% trans "Use Backup Token" %}
-                </button>
-              </p>
+          </div>
+          <div class="card-action-light">
+            <button type="submit" class="btn green waves-effect waves-light">
+              {% trans "Login" %}
+              <i class="material-icons right">send</i>
+            </button>
+            {% if request.site.preferences.auth__allow_password_change and wizard.steps.current == "auth" %}
+              <a href="{% url "account_reset_password" %}" class="btn-flat right waves-effect waves-light">
+                {% trans "Reset password" %}
+              </a>
             {% endif %}
-          </form>
-        </div>
-        <div class="card-action-light">
-          <button form="login_form" type="submit" class="btn green waves-effect waves-light">
-            {% trans "Login" %}
-            <i class="material-icons right">send</i>
-          </button>
-          {% if request.site.preferences.auth__allow_password_change %}
-            <a href="{% url "account_reset_password" %}" class="btn-flat right waves-effect waves-light">
-              {% trans "Reset password" %}
-            </a>
-          {% endif %}
+          </div>
         </div>
-      </div>
 
-      {% if wizard.steps.current == 'auth' and socialaccount_providers %}
-        <div class="card">
-          <div class="card-content">
+        {% if other_devices or backup_tokens %}
+          <div class="card">
+            <div class="card-content">
+              <div class="card-title">{% trans "Device currently not available?" %}</div>
+              {% if other_devices %}
+                <p>{% trans "Or, alternatively, use one of your backup phones:" %}</p>
+                <p>
+                  {% for other in other_devices %}
+                    <button name="challenge_device" value="{{ other.persistent_id }}" class="btn" type="submit">
+                      {{ other|device_action }}
+                    </button>
+                  {% endfor %}
+                </p>
+              {% endif %}
+              {% if backup_tokens %}
+                <p>{% trans "As a last resort, you can use a backup token:" %}</p>
+                <p>
+                  <button name="wizard_goto_step" type="submit" value="backup" class="btn">
+                    {% trans "Use Backup Token" %}
+                  </button>
+                </p>
+              {% endif %}
+            </div>
+          </div>
+        {% endif %}
+        {% if wizard.steps.current == 'auth' and socialaccount_providers %}
+          <div class="card">
+            <div class="card-content">
               <div class="card-title">
                 {% trans "Use alternative login options" %}
               </div>
               {% include "socialaccount/snippets/provider_list.html" with process="login" %}
+            </div>
           </div>
-        </div>
-      {% endif %}
+        {% endif %}
+      </div>
     </div>
-  </div>
+  </form>
+
 {% endblock %}
diff --git a/aleksis/core/tests/models/test_person.py b/aleksis/core/tests/models/test_person.py
index b42194f22424566bea2b99adc42b6995dbfaf626..dbe11f71812977c79b0b0fef5b4b975eca33b2e7 100644
--- a/aleksis/core/tests/models/test_person.py
+++ b/aleksis/core/tests/models/test_person.py
@@ -9,3 +9,9 @@ def test_full_name():
     _person = Person.objects.create(first_name="Jane", last_name="Doe")
 
     assert _person.full_name == "Doe, Jane"
+
+
+def test_delete():
+    _person = Person.objects.create(first_name="Jane", last_name="Doe")
+    _person.delete()
+    assert not Person.objects.filter(first_name="Jane", last_name="Doe").exists()
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index b09c6ff9456e1b7e749301a4f261fb5e642e380c..b3c2cc468aded72fe1b9e64af88e58b4fb936192 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -46,12 +46,11 @@ urlpatterns = [
     path("school_terms/create/", views.SchoolTermCreateView.as_view(), name="create_school_term"),
     path("school_terms/<int:pk>/", views.SchoolTermEditView.as_view(), name="edit_school_term"),
     path("persons", views.persons, name="persons"),
-    path("persons/accounts", views.persons_accounts, name="persons_accounts"),
-    path("person", views.person, name="person"),
-    path("person/create", views.edit_person, name="create_person"),
-    path("person/<int:id_>", views.person, name="person_by_id"),
-    path("person/<int:id_>/edit", views.edit_person, name="edit_person_by_id"),
-    path("person/<int:id_>/delete", views.delete_person, name="delete_person_by_id"),
+    path("person/", views.person, name="person"),
+    path("person/create/", views.CreatePersonView.as_view(), name="create_person"),
+    path("person/<int:id_>/", views.person, name="person_by_id"),
+    path("person/<int:pk>/edit/", views.EditPersonView.as_view(), name="edit_person_by_id"),
+    path("person/<int:id_>/delete/", views.delete_person, name="delete_person_by_id"),
     path("groups", views.groups, name="groups"),
     path("groups/additional_fields", views.additional_fields, name="additional_fields"),
     path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"),
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index c7b4b591e662dd0ae15384a5b8028539033359fb..2c40caf51d41045685a74b67800cc9575d3cf2de 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -210,14 +210,6 @@ def custom_information_processor(request: HttpRequest) -> dict:
 
     return {
         "FOOTER_MENU": CustomMenu.get_default("footer"),
-        "ALTERNATIVE_LOGIN_VIEWS_LIST": [
-            a[0]
-            for a in settings.ALTERNATIVE_LOGIN_VIEWS
-            if a[0] in settings.AUTHENTICATION_BACKENDS
-        ],
-        "ALTERNATIVE_LOGIN_VIEWS": [
-            a for a in settings.ALTERNATIVE_LOGIN_VIEWS if a[0] in settings.AUTHENTICATION_BACKENDS
-        ],
         "ADMINS": settings.ADMINS,
         "PWA_ICONS": regrouped_pwa_icons,
     }
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index e24bafa1705465173a8ae9d54669ae23d880ee04..8918f3c35d9ef661ae711faecbac6fb054fdb526 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -47,7 +47,6 @@ from oauth2_provider.models import Application
 from reversion import set_user
 from reversion.views import RevisionMixin
 from rules.contrib.views import PermissionRequiredMixin, permission_required
-from templated_email import send_templated_mail
 
 from aleksis.core.data_checks import DataCheckRegistry, check_data
 
@@ -60,10 +59,9 @@ from .forms import (
     EditAdditionalFieldForm,
     EditGroupForm,
     EditGroupTypeForm,
-    EditPersonForm,
     GroupPreferenceForm,
+    PersonForm,
     PersonPreferenceForm,
-    PersonsAccountsFormSet,
     SchoolTermForm,
     SitePreferenceForm,
 )
@@ -361,27 +359,6 @@ def groups(request: HttpRequest) -> HttpResponse:
     return render(request, "core/group/list.html", context)
 
 
-@never_cache
-@permission_required("core.link_persons_accounts_rule")
-def persons_accounts(request: HttpRequest) -> HttpResponse:
-    """View allowing to batch-process linking of users to persons."""
-    context = {}
-
-    # Get all persons
-    persons_qs = Person.objects.all()
-
-    # Form set with one form per known person
-    persons_accounts_formset = PersonsAccountsFormSet(request.POST or None, queryset=persons_qs)
-
-    if request.method == "POST":
-        if persons_accounts_formset.is_valid():
-            persons_accounts_formset.save()
-
-    context["persons_accounts_formset"] = persons_accounts_formset
-
-    return render(request, "core/person/accounts.html", context)
-
-
 @never_cache
 @permission_required("core.assign_child_groups_to_groups_rule")
 def groups_child_groups(request: HttpRequest) -> HttpResponse:
@@ -420,59 +397,38 @@ def groups_child_groups(request: HttpRequest) -> HttpResponse:
     return render(request, "core/group/child_groups.html", context)
 
 
-@never_cache
-@permission_required("core.edit_person_rule", fn=objectgetter_optional(Person))
-def edit_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
-    """Edit view for a single person, defaulting to logged-in person."""
-    context = {}
-
-    person = objectgetter_optional(Person)(request, id_)
-    context["person"] = person
-
-    if id_:
-        # Edit form for existing group
-        edit_person_form = EditPersonForm(
-            request, request.POST or None, request.FILES or None, instance=person
-        )
-    else:
-        # Empty form to create a new group
-        if request.user.has_perm("core.create_person_rule"):
-            edit_person_form = EditPersonForm(request, request.POST or None, request.FILES or None)
-        else:
-            raise PermissionDenied()
-    if request.method == "POST":
-        if edit_person_form.is_valid():
-            if person and person == request.user.person:
-                # Check if user edited non-editable field
-                notification_fields = get_site_preferences()[
-                    "account__notification_on_person_change"
-                ]
-                send_notification_fields = set(edit_person_form.changed_data).intersection(
-                    set(notification_fields)
-                )
-                context["send_notification_fields"] = send_notification_fields
-                if send_notification_fields:
-                    context["send_notification_fields"] = send_notification_fields
-                    send_templated_mail(
-                        template_name="person_changed",
-                        from_email=request.user.person.mail_sender_via,
-                        headers={
-                            "Reply-To": request.user.person.mail_sender,
-                            "Sender": request.user.person.mail_sender,
-                        },
-                        recipient_list=[
-                            get_site_preferences()["account__person_change_notification_contact"]
-                        ],
-                        context=context,
-                    )
-            with reversion.create_revision():
-                set_user(request.user)
-                edit_person_form.save(commit=True)
-            messages.success(request, _("The person has been saved."))
+@method_decorator(never_cache, name="dispatch")
+class CreatePersonView(PermissionRequiredMixin, AdvancedCreateView):
+    form_class = PersonForm
+    model = Person
+    permission_required = "core.create_person_rule"
+    template_name = "core/person/create.html"
+    success_message = _("The person has been saved.")
 
-    context["edit_person_form"] = edit_person_form
 
-    return render(request, "core/person/edit.html", context)
+@method_decorator(never_cache, name="dispatch")
+class EditPersonView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView):
+    form_class = PersonForm
+    model = Person
+    permission_required = "core.edit_person_rule"
+    context_object_name = "person"
+    template_name = "core/person/edit.html"
+    success_message = _("The person has been saved.")
+
+    def get_form_kwargs(self):
+        kwargs = super().get_form_kwargs()
+        kwargs["request"] = self.request
+        return kwargs
+
+    def form_valid(self, form):
+        if self.object == self.request.user.person:
+            # Get all changed fields and send a notification about them
+            notification_fields = get_site_preferences()["account__notification_on_person_change"]
+            send_notification_fields = set(form.changed_data).intersection(set(notification_fields))
+
+            if send_notification_fields:
+                self.object.notify_about_changed_data(send_notification_fields)
+        return super().form_valid(form)
 
 
 def get_group_by_id(request: HttpRequest, id_: Optional[int] = None):
diff --git a/poetry.lock b/poetry.lock
index 1b9117c68f975c4c634e14f22efe415034e02771..c9d4b0e2db4557925a052ed17ac3f3958a389ee9 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -6,11 +6,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "aleksis-builddeps"
 version = "4"
@@ -63,11 +58,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 vine = "5.0.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "appdirs"
 version = "1.4.4"
@@ -76,11 +66,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "appnope"
 version = "0.1.2"
@@ -89,11 +74,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "asgiref"
 version = "3.4.1"
@@ -105,11 +85,6 @@ python-versions = ">=3.6"
 [package.extras]
 tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "asn1crypto"
 version = "1.4.0"
@@ -118,11 +93,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "atomicwrites"
 version = "1.4.0"
@@ -131,11 +101,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "attrs"
 version = "21.2.0"
@@ -150,11 +115,6 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
 tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
 tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "babel"
 version = "2.9.1"
@@ -166,11 +126,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 [package.dependencies]
 pytz = ">=2015.7"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "backcall"
 version = "0.2.0"
@@ -179,11 +134,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "bandit"
 version = "1.7.0"
@@ -199,11 +149,6 @@ PyYAML = ">=5.3.1"
 six = ">=1.10.0"
 stevedore = ">=1.20.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "beautifulsoup4"
 version = "4.10.0"
@@ -219,11 +164,6 @@ soupsieve = ">1.2"
 html5lib = ["html5lib"]
 lxml = ["lxml"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "billiard"
 version = "3.6.4.0"
@@ -232,11 +172,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "black"
 version = "19.10b0"
@@ -257,11 +192,6 @@ typed-ast = ">=1.4.0"
 [package.extras]
 d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "bleach"
 version = "4.1.0"
@@ -275,11 +205,6 @@ packaging = "*"
 six = ">=1.9.0"
 webencodings = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "boolean.py"
 version = "3.8"
@@ -288,35 +213,25 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "boto3"
-version = "1.18.52"
+version = "1.19.3"
 description = "The AWS SDK for Python"
 category = "main"
 optional = true
 python-versions = ">= 3.6"
 
 [package.dependencies]
-botocore = ">=1.21.52,<1.22.0"
+botocore = ">=1.22.3,<1.23.0"
 jmespath = ">=0.7.1,<1.0.0"
 s3transfer = ">=0.5.0,<0.6.0"
 
 [package.extras]
 crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "botocore"
-version = "1.21.52"
+version = "1.22.3"
 description = "Low-level, data-driven core of boto 3."
 category = "main"
 optional = true
@@ -328,17 +243,12 @@ python-dateutil = ">=2.1,<3.0.0"
 urllib3 = ">=1.25.4,<1.27"
 
 [package.extras]
-crt = ["awscrt (==0.11.24)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+crt = ["awscrt (==0.12.5)"]
 
 [[package]]
 name = "bs4"
 version = "0.0.1"
-description = "Screen-scraping library"
+description = "Dummy package for Beautiful Soup"
 category = "main"
 optional = false
 python-versions = "*"
@@ -346,11 +256,6 @@ python-versions = "*"
 [package.dependencies]
 beautifulsoup4 = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "calendarweek"
 version = "0.5.0"
@@ -362,11 +267,6 @@ python-versions = ">=3.7,<4.0"
 [package.extras]
 django = ["Django (>=2.2,<4.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "celery"
 version = "5.1.2"
@@ -420,11 +320,6 @@ yaml = ["PyYAML (>=3.10)"]
 zookeeper = ["kazoo (>=1.3.1)"]
 zstd = ["zstandard"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "celery-haystack-ng"
 version = "0.20.post2"
@@ -438,11 +333,6 @@ celery = ">=4.0"
 django-appconf = ">=0.4.1"
 django-haystack = ">=2.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "celery-progress"
 version = "0.1.1"
@@ -456,27 +346,17 @@ rabbitmq = ["channels-rabbitmq"]
 redis = ["channels-redis"]
 websockets = ["channels"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "certifi"
-version = "2021.5.30"
+version = "2021.10.8"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "cffi"
-version = "1.14.6"
+version = "1.15.0"
 description = "Foreign Function Interface for Python calling C code."
 category = "main"
 optional = false
@@ -485,14 +365,9 @@ python-versions = "*"
 [package.dependencies]
 pycparser = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "charset-normalizer"
-version = "2.0.6"
+version = "2.0.7"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
 category = "main"
 optional = false
@@ -501,11 +376,6 @@ python-versions = ">=3.5.0"
 [package.extras]
 unicode_backport = ["unicodedata2"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "click"
 version = "7.1.2"
@@ -514,11 +384,6 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "click-didyoumean"
 version = "0.3.0"
@@ -530,11 +395,6 @@ python-versions = ">=3.6.2,<4.0.0"
 [package.dependencies]
 click = ">=7"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "click-plugins"
 version = "1.1.1"
@@ -549,11 +409,6 @@ click = ">=4.0"
 [package.extras]
 dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "click-repl"
 version = "0.2.0"
@@ -567,11 +422,6 @@ click = "*"
 prompt-toolkit = "*"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "colorama"
 version = "0.4.4"
@@ -580,11 +430,6 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "colour"
 version = "0.1.5"
@@ -596,11 +441,6 @@ python-versions = "*"
 [package.extras]
 test = ["nose"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "configobj"
 version = "5.0.6"
@@ -612,30 +452,20 @@ python-versions = "*"
 [package.dependencies]
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "coverage"
-version = "5.5"
+version = "6.0.2"
 description = "Code coverage measurement for Python"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+python-versions = ">=3.6"
 
 [package.extras]
-toml = ["toml"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+toml = ["tomli"]
 
 [[package]]
 name = "cryptography"
-version = "3.4.8"
+version = "35.0.0"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 category = "main"
 optional = false
@@ -648,14 +478,9 @@ cffi = ">=1.12"
 docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
 docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
 pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
-sdist = ["setuptools-rust (>=0.11.4)"]
+sdist = ["setuptools_rust (>=0.11.4)"]
 ssh = ["bcrypt (>=3.1.5)"]
-test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
 
 [[package]]
 name = "curlylint"
@@ -675,11 +500,6 @@ toml = ">=0.9.4"
 [package.extras]
 dev = ["black (==19.10b0)", "flake8 (==3.8.4)", "mypy (==0.812)", "pytest (==6.2.2)", "coverage (==5.4)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "decorator"
 version = "5.1.0"
@@ -688,11 +508,6 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "defusedxml"
 version = "0.7.1"
@@ -701,11 +516,6 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "deprecated"
 version = "1.2.13"
@@ -720,11 +530,6 @@ wrapt = ">=1.10,<2"
 [package.extras]
 dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "dj-database-url"
 version = "0.5.0"
@@ -733,14 +538,9 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django"
-version = "3.2.7"
+version = "3.2.8"
 description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
 category = "main"
 optional = false
@@ -755,11 +555,6 @@ sqlparse = ">=0.2.2"
 argon2 = ["argon2-cffi (>=19.1.0)"]
 bcrypt = ["bcrypt"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-allauth"
 version = "0.45.0"
@@ -775,11 +570,6 @@ python3-openid = ">=3.0.8"
 requests = "*"
 requests-oauthlib = ">=0.3.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-any-js"
 version = "1.1"
@@ -791,11 +581,6 @@ python-versions = ">=3.7,<4.0"
 [package.dependencies]
 Django = ">=2.2,<4.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-appconf"
 version = "1.0.5"
@@ -807,11 +592,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 django = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-auth-ldap"
 version = "2.4.0"
@@ -824,11 +604,6 @@ python-versions = ">=3.6"
 Django = ">=2.2"
 python-ldap = ">=3.1"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-bleach"
 version = "0.8.0"
@@ -841,11 +616,6 @@ python-versions = "*"
 bleach = ">=1.5.0"
 Django = ">=1.11"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-cachalot"
 version = "2.4.3"
@@ -857,11 +627,6 @@ python-versions = "*"
 [package.dependencies]
 Django = ">=2.2,<3.3"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-cache-memoize"
 version = "0.1.10"
@@ -873,11 +638,6 @@ python-versions = ">=3.5"
 [package.extras]
 dev = ["flake8", "tox", "twine", "therapist", "black"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-celery-beat"
 version = "2.2.1"
@@ -892,11 +652,6 @@ Django = ">=2.2,<4.0"
 django-timezone-field = ">=4.1.0,<5.0"
 python-crontab = ">=2.3.4"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-celery-email"
 version = "3.0.0"
@@ -910,11 +665,6 @@ celery = ">=4.0"
 django = ">=2.2"
 django-appconf = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-celery-results"
 version = "2.2.0"
@@ -926,11 +676,6 @@ python-versions = "*"
 [package.dependencies]
 celery = ">=5.0,<6.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-ckeditor"
 version = "6.1.0"
@@ -942,11 +687,6 @@ python-versions = "*"
 [package.dependencies]
 django-js-asset = ">=1.2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-cleanup"
 version = "5.2.0"
@@ -955,24 +695,14 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-colorfield"
-version = "0.4.3"
+version = "0.4.5"
 description = "simple color field for your models with a nice color-picker in the admin-interface."
 category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-dbbackup"
 version = "3.3.0"
@@ -986,11 +716,6 @@ Django = ">=1.5"
 pytz = "*"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-debug-toolbar"
 version = "3.2.2"
@@ -1003,14 +728,9 @@ python-versions = ">=3.6"
 Django = ">=2.2"
 sqlparse = ">=0.2.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-dynamic-preferences"
-version = "1.10.1"
+version = "1.11.0"
 description = "Dynamic global and instance settings for your django project"
 category = "main"
 optional = false
@@ -1021,11 +741,6 @@ django = ">=1.11"
 persisting-theory = ">=0.2.1"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-extensions"
 version = "3.1.3"
@@ -1037,11 +752,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 Django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-favicon-plus-reloaded"
 version = "1.1.3"
@@ -1054,11 +764,6 @@ python-versions = "*"
 django = "*"
 pillow = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-filter"
 version = "2.4.0"
@@ -1070,11 +775,6 @@ python-versions = ">=3.5"
 [package.dependencies]
 Django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-formtools"
 version = "2.3"
@@ -1086,11 +786,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 Django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-guardian"
 version = "2.4.0"
@@ -1102,11 +797,6 @@ python-versions = ">=3.5"
 [package.dependencies]
 Django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-haystack"
 version = "3.0"
@@ -1118,11 +808,6 @@ python-versions = "*"
 [package.dependencies]
 Django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-health-check"
 version = "3.16.4"
@@ -1134,11 +819,6 @@ python-versions = "*"
 [package.dependencies]
 django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-impersonate"
 version = "1.7.3"
@@ -1147,11 +827,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-ipware"
 version = "4.0.0"
@@ -1160,11 +835,6 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-js-asset"
 version = "1.2.2"
@@ -1173,11 +843,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-js-reverse"
 version = "0.9.1"
@@ -1189,11 +854,6 @@ python-versions = "*"
 [package.dependencies]
 Django = ">=1.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-jsonstore"
 version = "0.5.0"
@@ -1206,11 +866,6 @@ python-versions = "*"
 Django = ">=1.11"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-maintenance-mode"
 version = "0.16.1"
@@ -1219,11 +874,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-material"
 version = "1.9.0"
@@ -1235,11 +885,6 @@ python-versions = "*"
 [package.dependencies]
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-menu-generator-ng"
 version = "1.2.3"
@@ -1248,14 +893,9 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-model-utils"
-version = "4.1.1"
+version = "4.2.0"
 description = "Django model mixins and utilities"
 category = "main"
 optional = false
@@ -1264,11 +904,6 @@ python-versions = "*"
 [package.dependencies]
 Django = ">=2.0.1"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-oauth-toolkit"
 version = "1.5.0"
@@ -1284,11 +919,6 @@ oauthlib = ">=3.1.0"
 requests = ">=2.13.0"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-otp"
 version = "1.1.1"
@@ -1303,11 +933,6 @@ django = ">=2.2"
 [package.extras]
 qrcode = ["qrcode"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-otp-yubikey"
 version = "1.0.0.post1"
@@ -1320,11 +945,6 @@ python-versions = "*"
 django-otp = ">=1.0.0"
 YubiOTP = ">=0.2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-phonenumber-field"
 version = "5.2.0"
@@ -1341,11 +961,6 @@ phonenumbers = {version = ">=7.0.2", optional = true, markers = "extra == \"phon
 phonenumbers = ["phonenumbers (>=7.0.2)"]
 phonenumberslite = ["phonenumberslite (>=7.0.2)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-polymorphic"
 version = "3.0.0"
@@ -1357,11 +972,6 @@ python-versions = "*"
 [package.dependencies]
 Django = ">=2.1"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-prometheus"
 version = "2.1.0"
@@ -1373,11 +983,6 @@ python-versions = "*"
 [package.dependencies]
 prometheus-client = ">=0.7"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-redis"
 version = "5.0.0"
@@ -1390,11 +995,6 @@ python-versions = ">=3.6"
 Django = ">=2.2"
 redis = ">=3.0.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-render-block"
 version = "0.8.1"
@@ -1406,11 +1006,6 @@ python-versions = ">=3.5"
 [package.dependencies]
 django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-reversion"
 version = "4.0.0"
@@ -1422,30 +1017,20 @@ python-versions = ">=3.6"
 [package.dependencies]
 django = ">=2.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-sass-processor"
-version = "1.1"
+version = "1.0.0"
 description = "SASS processor to compile SCSS files into *.css, while rendering, or offline."
 category = "main"
 optional = false
 python-versions = "*"
 
 [package.extras]
-management-command = ["django-compressor (>=2.4)"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+management_command = ["django-compressor (>=2.4)"]
 
 [[package]]
 name = "django-select2"
-version = "7.7.2"
+version = "7.7.3"
 description = "Select2 option fields for Django"
 category = "main"
 optional = false
@@ -1458,14 +1043,9 @@ django-appconf = ">=0.6.0"
 [package.extras]
 test = ["pytest", "pytest-cov", "pytest-django", "selenium"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-storages"
-version = "1.11.1"
+version = "1.12.2"
 description = "Support for many storage backends in Django"
 category = "main"
 optional = true
@@ -1475,18 +1055,13 @@ python-versions = ">=3.5"
 Django = ">=2.2"
 
 [package.extras]
-azure = ["azure-storage-blob (>=1.3.1,<12.0.0)"]
+azure = ["azure-storage-blob (>=12.0.0)"]
 boto3 = ["boto3 (>=1.4.4)"]
 dropbox = ["dropbox (>=7.2.1)"]
-google = ["google-cloud-storage (>=1.15.0)"]
+google = ["google-cloud-storage (>=1.27.0)"]
 libcloud = ["apache-libcloud"]
 sftp = ["paramiko"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-stubs"
 version = "1.9.0"
@@ -1504,11 +1079,6 @@ types-pytz = "*"
 types-PyYAML = "*"
 typing-extensions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-stubs-ext"
 version = "0.3.1"
@@ -1521,14 +1091,9 @@ python-versions = ">=3.6"
 django = "*"
 typing-extensions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-tables2"
-version = "2.4.0"
+version = "2.4.1"
 description = "Table/data-grid framework for Django"
 category = "main"
 optional = false
@@ -1540,11 +1105,6 @@ Django = ">=1.11"
 [package.extras]
 tablib = ["tablib"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-templated-email"
 version = "3.0.0"
@@ -1556,11 +1116,6 @@ python-versions = "*"
 [package.dependencies]
 django-render-block = ">=0.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-timezone-field"
 version = "4.2.1"
@@ -1576,11 +1131,6 @@ pytz = "*"
 [package.extras]
 rest_framework = ["djangorestframework (>=3.0.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-titofisto"
 version = "0.1.2.post1"
@@ -1592,11 +1142,6 @@ python-versions = ">=3.9,<4.0"
 [package.dependencies]
 Django = ">2.2,<4.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-two-factor-auth"
 version = "1.13.1"
@@ -1622,11 +1167,6 @@ phonenumberslite = ["phonenumberslite (>=7.0.9,<8.99)"]
 sms = ["twilio (>=6.0)"]
 yubikey = ["django-otp-yubikey"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-uwsgi-ng"
 version = "1.1.2"
@@ -1638,24 +1178,14 @@ python-versions = "*"
 [package.extras]
 uwsgi = ["uwsgi"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-widget-tweaks"
-version = "1.4.8"
+version = "1.4.9"
 description = "Tweak the form field rendering in templates, not in python-level form definitions."
 category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "django-yarnpkg"
 version = "6.0.1"
@@ -1668,11 +1198,6 @@ python-versions = "*"
 django = "*"
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "djangorestframework"
 version = "3.12.4"
@@ -1684,11 +1209,6 @@ python-versions = ">=3.5"
 [package.dependencies]
 django = ">=2.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "docutils"
 version = "0.16"
@@ -1697,11 +1217,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "dparse"
 version = "0.5.1"
@@ -1718,11 +1233,6 @@ toml = "*"
 [package.extras]
 pipenv = ["pipenv"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "dynaconf"
 version = "3.1.7"
@@ -1745,11 +1255,6 @@ toml = ["toml"]
 vault = ["hvac"]
 yaml = ["ruamel.yaml"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8"
 version = "3.9.2"
@@ -1763,11 +1268,6 @@ mccabe = ">=0.6.0,<0.7.0"
 pycodestyle = ">=2.7.0,<2.8.0"
 pyflakes = ">=2.3.0,<2.4.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-bandit"
 version = "2.1.2"
@@ -1782,11 +1282,6 @@ flake8 = "*"
 flake8-polyfill = "*"
 pycodestyle = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-black"
 version = "0.2.3"
@@ -1800,11 +1295,6 @@ black = "*"
 flake8 = ">=3.0.0"
 toml = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-builtins"
 version = "1.5.3"
@@ -1819,11 +1309,6 @@ flake8 = "*"
 [package.extras]
 test = ["coverage", "coveralls", "mock", "pytest", "pytest-cov"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-django"
 version = "1.1.2"
@@ -1835,11 +1320,6 @@ python-versions = ">=3.6,<4.0"
 [package.dependencies]
 flake8 = ">=3.8.4,<4.0.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-docstrings"
 version = "1.6.0"
@@ -1852,11 +1332,6 @@ python-versions = "*"
 flake8 = ">=3"
 pydocstyle = ">=2.1"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-fixme"
 version = "1.1.1"
@@ -1865,31 +1340,21 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-isort"
-version = "4.0.0"
+version = "4.1.1"
 description = "flake8 plugin that integrates isort ."
 category = "dev"
 optional = false
 python-versions = "*"
 
 [package.dependencies]
-flake8 = ">=3.2.1,<4"
+flake8 = ">=3.2.1,<5"
 isort = ">=4.3.5,<6"
 testfixtures = ">=6.8.0,<7"
 
 [package.extras]
-test = ["pytest (>=4.0.2,<6)", "toml"]
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+test = ["pytest-cov"]
 
 [[package]]
 name = "flake8-mypy"
@@ -1904,11 +1369,6 @@ attrs = "*"
 flake8 = ">=3.0.0"
 mypy = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-polyfill"
 version = "1.0.2"
@@ -1920,11 +1380,6 @@ python-versions = "*"
 [package.dependencies]
 flake8 = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "flake8-rst-docstrings"
 version = "0.2.3"
@@ -1938,11 +1393,6 @@ flake8 = ">=3.0.0"
 pygments = "*"
 restructuredtext-lint = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "freezegun"
 version = "1.1.0"
@@ -1954,26 +1404,16 @@ python-versions = ">=3.5"
 [package.dependencies]
 python-dateutil = ">=2.7"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "gitdb"
-version = "4.0.7"
+version = "4.0.9"
 description = "Git Object Database"
 category = "dev"
 optional = false
-python-versions = ">=3.4"
+python-versions = ">=3.6"
 
 [package.dependencies]
-smmap = ">=3.0.1,<5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+smmap = ">=3.0.1,<6"
 
 [[package]]
 name = "gitpython"
@@ -1987,11 +1427,6 @@ python-versions = ">=3.7"
 gitdb = ">=4.0.1,<5"
 typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""}
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "haystack-redis"
 version = "0.0.1"
@@ -2005,11 +1440,6 @@ django-haystack = "*"
 redis = "*"
 whoosh = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "html2text"
 version = "2020.1.16"
@@ -2018,24 +1448,14 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "idna"
-version = "3.2"
+version = "3.3"
 description = "Internationalized Domain Names in Applications (IDNA)"
 category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "imagesize"
 version = "1.2.0"
@@ -2044,11 +1464,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "iniconfig"
 version = "1.1.1"
@@ -2057,11 +1472,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "ipython"
 version = "7.28.0"
@@ -2094,11 +1504,6 @@ parallel = ["ipyparallel"]
 qtconsole = ["qtconsole"]
 test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "isort"
 version = "5.9.3"
@@ -2108,16 +1513,11 @@ optional = false
 python-versions = ">=3.6.1,<4.0"
 
 [package.extras]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
-requirements_deprecated_finder = ["pip-api", "pipreqs"]
 pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
+requirements_deprecated_finder = ["pipreqs", "pip-api"]
+colors = ["colorama (>=0.4.3,<0.5.0)"]
 plugins = ["setuptools"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "jedi"
 version = "0.18.0"
@@ -2133,14 +1533,9 @@ parso = ">=0.8.0,<0.9.0"
 qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
 testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "jinja2"
-version = "3.0.1"
+version = "3.0.2"
 description = "A very fast and expressive template engine."
 category = "dev"
 optional = false
@@ -2152,11 +1547,6 @@ MarkupSafe = ">=2.0"
 [package.extras]
 i18n = ["Babel (>=2.7)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "jmespath"
 version = "0.10.0"
@@ -2165,11 +1555,6 @@ category = "main"
 optional = true
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "jwcrypto"
 version = "1.0"
@@ -2182,11 +1567,6 @@ python-versions = "*"
 cryptography = ">=2.3"
 deprecated = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "kombu"
 version = "5.1.0"
@@ -2215,11 +1595,6 @@ sqs = ["boto3 (>=1.4.4)", "pycurl (==7.43.0.2)", "urllib3 (<1.26)"]
 yaml = ["PyYAML (>=3.10)"]
 zookeeper = ["kazoo (>=1.3.1)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "libsass"
 version = "0.21.0"
@@ -2231,11 +1606,6 @@ python-versions = "*"
 [package.dependencies]
 six = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "license-expression"
 version = "1.2"
@@ -2247,11 +1617,6 @@ python-versions = "*"
 [package.dependencies]
 "boolean.py" = ">=3.6,<4.0.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "markupsafe"
 version = "2.0.1"
@@ -2260,11 +1625,6 @@ category = "dev"
 optional = false
 python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "matplotlib-inline"
 version = "0.1.3"
@@ -2276,11 +1636,6 @@ python-versions = ">=3.5"
 [package.dependencies]
 traitlets = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "mccabe"
 version = "0.6.1"
@@ -2289,11 +1644,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "mypy"
 version = "0.910"
@@ -2311,11 +1661,6 @@ typing-extensions = ">=3.7.4"
 dmypy = ["psutil (>=4.0)"]
 python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "mypy-extensions"
 version = "0.4.3"
@@ -2324,11 +1669,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "oauthlib"
 version = "3.1.1"
@@ -2342,11 +1682,6 @@ rsa = ["cryptography (>=3.0.0,<4)"]
 signals = ["blinker (>=1.4.0)"]
 signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "packaging"
 version = "21.0"
@@ -2358,11 +1693,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 pyparsing = ">=2.0.2"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "parso"
 version = "0.8.2"
@@ -2375,11 +1705,6 @@ python-versions = ">=3.6"
 qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
 testing = ["docopt", "pytest (<6.0.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "parsy"
 version = "1.1.0"
@@ -2388,11 +1713,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pathspec"
 version = "0.9.0"
@@ -2401,11 +1721,6 @@ category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pbr"
 version = "5.6.0"
@@ -2414,11 +1729,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "persisting-theory"
 version = "0.2.1"
@@ -2427,11 +1737,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pexpect"
 version = "4.8.0"
@@ -2443,14 +1748,9 @@ python-versions = "*"
 [package.dependencies]
 ptyprocess = ">=0.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pg8000"
-version = "1.21.2"
+version = "1.22.0"
 description = "PostgreSQL interface library"
 category = "dev"
 optional = false
@@ -2459,24 +1759,14 @@ python-versions = ">=3.6"
 [package.dependencies]
 scramp = ">=1.4.1"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "phonenumbers"
-version = "8.12.33"
+version = "8.12.35"
 description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
 category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pickleshare"
 version = "0.7.5"
@@ -2485,24 +1775,14 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pillow"
-version = "8.3.2"
+version = "8.4.0"
 description = "Python Imaging Library (Fork)"
 category = "main"
 optional = false
 python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pluggy"
 version = "1.0.0"
@@ -2515,11 +1795,6 @@ python-versions = ">=3.6"
 dev = ["pre-commit", "tox"]
 testing = ["pytest", "pytest-benchmark"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "prometheus-client"
 version = "0.11.0"
@@ -2531,14 +1806,9 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 [package.extras]
 twisted = ["twisted"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "prompt-toolkit"
-version = "3.0.20"
+version = "3.0.21"
 description = "Library for building powerful interactive command lines in Python"
 category = "main"
 optional = false
@@ -2547,11 +1817,6 @@ python-versions = ">=3.6.2"
 [package.dependencies]
 wcwidth = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "psutil"
 version = "5.8.0"
@@ -2563,11 +1828,6 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 [package.extras]
 test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "psycopg2"
 version = "2.9.1"
@@ -2576,11 +1836,6 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "ptyprocess"
 version = "0.7.0"
@@ -2589,11 +1844,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "py"
 version = "1.10.0"
@@ -2602,11 +1852,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyasn1"
 version = "0.4.8"
@@ -2615,11 +1860,6 @@ category = "main"
 optional = true
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyasn1-modules"
 version = "0.2.8"
@@ -2631,11 +1871,6 @@ python-versions = "*"
 [package.dependencies]
 pyasn1 = ">=0.4.6,<0.5.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pycodestyle"
 version = "2.7.0"
@@ -2644,11 +1879,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pycparser"
 version = "2.20"
@@ -2657,24 +1887,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pycryptodome"
-version = "3.10.4"
+version = "3.11.0"
 description = "Cryptographic library for Python"
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pydocstyle"
 version = "6.1.1"
@@ -2689,11 +1909,6 @@ snowballstemmer = "*"
 [package.extras]
 toml = ["toml"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyflakes"
 version = "2.3.1"
@@ -2702,11 +1917,6 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pygments"
 version = "2.10.0"
@@ -2715,45 +1925,33 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyjwt"
-version = "2.1.0"
+version = "2.3.0"
 description = "JSON Web Token implementation in Python"
 category = "main"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-cryptography = {version = ">=3.3.1,<4.0.0", optional = true, markers = "extra == \"crypto\""}
+cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""}
 
 [package.extras]
-crypto = ["cryptography (>=3.3.1,<4.0.0)"]
-dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1,<4.0.0)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"]
+crypto = ["cryptography (>=3.3.1)"]
+dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"]
 docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
 tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyparsing"
-version = "2.4.7"
+version = "3.0.1"
 description = "Python parsing module"
 category = "main"
 optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
 
 [[package]]
 name = "pytest"
@@ -2776,11 +1974,6 @@ toml = "*"
 [package.extras]
 testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pytest-cov"
 version = "2.12.1"
@@ -2797,11 +1990,6 @@ toml = "*"
 [package.extras]
 testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pytest-django"
 version = "4.4.0"
@@ -2817,11 +2005,6 @@ pytest = ">=5.4.0"
 docs = ["sphinx", "sphinx-rtd-theme"]
 testing = ["django", "django-configurations (>=2.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pytest-django-testing-postgresql"
 version = "0.1.post0"
@@ -2834,11 +2017,6 @@ python-versions = "*"
 dj-database-url = "*"
 "testing.postgresql" = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pytest-sugar"
 version = "0.9.4"
@@ -2852,14 +2030,9 @@ packaging = ">=14.1"
 pytest = ">=2.9"
 termcolor = ">=1.1.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "python-crontab"
-version = "2.5.1"
+version = "2.6.0"
 description = "Python Crontab API"
 category = "main"
 optional = false
@@ -2872,11 +2045,6 @@ python-dateutil = "*"
 cron-description = ["cron-descriptor"]
 cron-schedule = ["croniter"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "python-dateutil"
 version = "2.8.2"
@@ -2888,11 +2056,6 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 [package.dependencies]
 six = ">=1.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "python-gnupg"
 version = "0.4.7"
@@ -2901,11 +2064,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "python-ldap"
 version = "3.3.1"
@@ -2918,11 +2076,6 @@ python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
 pyasn1 = ">=0.3.7"
 pyasn1_modules = ">=0.1.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "python3-openid"
 version = "3.2.0"
@@ -2938,36 +2091,21 @@ defusedxml = "*"
 mysql = ["mysql-connector-python"]
 postgresql = ["psycopg2"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pytz"
-version = "2021.1"
+version = "2021.3"
 description = "World timezone definitions, modern and historical"
 category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "pyyaml"
-version = "5.4.1"
+version = "6.0"
 description = "YAML parser and emitter for Python"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+python-versions = ">=3.6"
 
 [[package]]
 name = "qrcode"
@@ -2987,11 +2125,6 @@ maintainer = ["zest.releaser"]
 pil = ["pillow"]
 test = ["pytest", "pytest-cov", "mock"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "redis"
 version = "3.5.3"
@@ -3003,24 +2136,14 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 [package.extras]
 hiredis = ["hiredis (>=0.1.3)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "regex"
-version = "2021.9.30"
+version = "2021.10.23"
 description = "Alternative regular expression module, to replace re."
 category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "requests"
 version = "2.26.0"
@@ -3039,11 +2162,6 @@ urllib3 = ">=1.21.1,<1.27"
 socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
 use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "requests-oauthlib"
 version = "1.3.0"
@@ -3059,11 +2177,6 @@ requests = ">=2.0.0"
 [package.extras]
 rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "restructuredtext-lint"
 version = "1.3.2"
@@ -3075,11 +2188,6 @@ python-versions = "*"
 [package.dependencies]
 docutils = ">=0.11,<1.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "ruamel.yaml"
 version = "0.17.16"
@@ -3095,11 +2203,6 @@ python-versions = ">=3"
 docs = ["ryd"]
 jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "ruamel.yaml.clib"
 version = "0.2.6"
@@ -3108,11 +2211,6 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "rules"
 version = "2.2"
@@ -3121,11 +2219,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "s3transfer"
 version = "0.5.0"
@@ -3140,11 +2233,6 @@ botocore = ">=1.12.36,<2.0a.0"
 [package.extras]
 crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "safety"
 version = "1.10.3"
@@ -3159,11 +2247,6 @@ dparse = ">=0.5.1"
 packaging = "*"
 requests = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "scramp"
 version = "1.4.1"
@@ -3175,11 +2258,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 asn1crypto = ">=1.4.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "selenium"
 version = "3.141.0"
@@ -3191,11 +2269,6 @@ python-versions = "*"
 [package.dependencies]
 urllib3 = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "six"
 version = "1.16.0"
@@ -3204,23 +2277,13 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "smmap"
-version = "4.0.0"
+version = "5.0.0"
 description = "A pure Python implementation of a sliding window memory map manager"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+python-versions = ">=3.6"
 
 [[package]]
 name = "snowballstemmer"
@@ -3230,11 +2293,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "soupsieve"
 version = "2.2.1"
@@ -3243,11 +2301,6 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "spdx-license-list"
 version = "0.5.2"
@@ -3256,11 +2309,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinx"
 version = "3.5.4"
@@ -3292,11 +2340,6 @@ docs = ["sphinxcontrib-websupport"]
 lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"]
 test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinx-autodoc-typehints"
 version = "1.12.0"
@@ -3312,11 +2355,6 @@ Sphinx = ">=3.0"
 test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"]
 type_comments = ["typed-ast (>=1.4.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinx-materialdesign-theme"
 version = "0.1.11"
@@ -3325,11 +2363,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-applehelp"
 version = "1.0.2"
@@ -3342,11 +2375,6 @@ python-versions = ">=3.5"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-devhelp"
 version = "1.0.2"
@@ -3359,11 +2387,6 @@ python-versions = ">=3.5"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-django"
 version = "0.5.1"
@@ -3372,11 +2395,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-htmlhelp"
 version = "2.0.0"
@@ -3389,11 +2407,6 @@ python-versions = ">=3.6"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest", "html5lib"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-jsmath"
 version = "1.0.1"
@@ -3405,11 +2418,6 @@ python-versions = ">=3.5"
 [package.extras]
 test = ["pytest", "flake8", "mypy"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-qthelp"
 version = "1.0.3"
@@ -3422,11 +2430,6 @@ python-versions = ">=3.5"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sphinxcontrib-serializinghtml"
 version = "1.1.5"
@@ -3439,11 +2442,6 @@ python-versions = ">=3.5"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "sqlparse"
 version = "0.4.2"
@@ -3452,14 +2450,9 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "stevedore"
-version = "3.4.0"
+version = "3.5.0"
 description = "Manage dynamic plugins for Python applications"
 category = "dev"
 optional = false
@@ -3468,11 +2461,6 @@ python-versions = ">=3.6"
 [package.dependencies]
 pbr = ">=2.0.0,<2.1.0 || >2.1.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "termcolor"
 version = "1.1.0"
@@ -3481,11 +2469,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "testfixtures"
 version = "6.18.3"
@@ -3499,11 +2482,6 @@ build = ["setuptools-git", "wheel", "twine"]
 docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
 test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "testing.common.database"
 version = "2.0.3"
@@ -3515,11 +2493,6 @@ python-versions = "*"
 [package.extras]
 testing = ["nose"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "testing.postgresql"
 version = "1.3.0"
@@ -3535,11 +2508,6 @@ pg8000 = ">=1.10"
 [package.extras]
 testing = ["sqlalchemy", "nose", "psycopg2"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "toml"
 version = "0.10.2"
@@ -3548,14 +2516,9 @@ category = "main"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "traitlets"
-version = "5.1.0"
+version = "5.1.1"
 description = "Traitlets Python configuration system"
 category = "main"
 optional = false
@@ -3564,14 +2527,9 @@ python-versions = ">=3.7"
 [package.extras]
 test = ["pytest"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "twilio"
-version = "7.0.0"
+version = "7.2.0"
 description = "Twilio API client and TwiML generator"
 category = "main"
 optional = false
@@ -3582,11 +2540,6 @@ PyJWT = ">=2.0.0,<3.0.0"
 pytz = "*"
 requests = ">=2.0.0"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "typed-ast"
 version = "1.4.3"
@@ -3595,37 +2548,22 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "types-pytz"
-version = "2021.1.2"
+version = "2021.3.0"
 description = "Typing stubs for pytz"
 category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "types-pyyaml"
-version = "5.4.10"
+version = "6.0.0"
 description = "Typing stubs for PyYAML"
 category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "typing-extensions"
 version = "3.10.0.2"
@@ -3634,11 +2572,6 @@ category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "urllib3"
 version = "1.26.7"
@@ -3652,24 +2585,14 @@ brotli = ["brotlipy (>=0.6.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "uwsgi"
-version = "2.0.19.1"
+version = "2.0.20"
 description = "The uWSGI server"
 category = "dev"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "vine"
 version = "5.0.0"
@@ -3678,11 +2601,6 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "wcwidth"
 version = "0.2.5"
@@ -3691,11 +2609,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "webencodings"
 version = "0.5.1"
@@ -3704,11 +2617,6 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "whoosh"
 version = "2.7.4"
@@ -3717,23 +2625,13 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [[package]]
 name = "wrapt"
-version = "1.12.1"
+version = "1.13.2"
 description = "Module for decorators, wrappers and monkey patching."
 category = "main"
 optional = false
-python-versions = "*"
-
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [[package]]
 name = "yubiotp"
@@ -3746,11 +2644,6 @@ python-versions = "*"
 [package.dependencies]
 pycryptodome = "*"
 
-[package.source]
-type = "legacy"
-url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
-reference = "gitlab"
-
 [extras]
 ldap = ["django-auth-ldap"]
 s3 = ["boto3", "django-storages"]
@@ -3758,7 +2651,7 @@ s3 = ["boto3", "django-storages"]
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.9"
-content-hash = "95d36470d3b0297d1dc7921f52d66a758de153d002c5b98ffd9ed57bebe60a55"
+content-hash = "9117742426e175d6402dac268ed74f7e72e084fe020e5ebf22e97915ff7acd0d"
 
 [metadata.files]
 alabaster = [
@@ -3830,12 +2723,12 @@ bleach = [
     {file = "boolean.py-3.8.tar.gz", hash = "sha256:cc24e20f985d60cd4a3a5a1c0956dd12611159d32a75081dabd0c9ab981acaa4"},
 ]
 boto3 = [
-    {file = "boto3-1.18.52-py3-none-any.whl", hash = "sha256:27824d3767c5213f0006f71e552b912bc4659241b77ca8b0be0b813cf0518a9e"},
-    {file = "boto3-1.18.52.tar.gz", hash = "sha256:5b585a279478bd6df4b07db7d6150f413ba6add1f38e68aaa533d3337efd0b22"},
+    {file = "boto3-1.19.3-py3-none-any.whl", hash = "sha256:2dfc8cf34d6dfbdfca4c88e8fddf9fe95cde489fb83144fe35f989ec6790e325"},
+    {file = "boto3-1.19.3.tar.gz", hash = "sha256:e36ffaf9969648e2f435aa1f0029956fea3aac52466eef3bcb43bde498a182dd"},
 ]
 botocore = [
-    {file = "botocore-1.21.52-py3-none-any.whl", hash = "sha256:e8797c0933c660e130cf2f51667f5003950d7e592f4c3944e8f04f201493d17a"},
-    {file = "botocore-1.21.52.tar.gz", hash = "sha256:04c071aec4f1981b38e3be760838b976337fd6ebd95a31ceeca9f9e4b4733c1f"},
+    {file = "botocore-1.22.3-py3-none-any.whl", hash = "sha256:aacdb9b8e09e356515966251d1e08d9929575a76af504992bfb941553dee59c2"},
+    {file = "botocore-1.22.3.tar.gz", hash = "sha256:53ca22aeac9b53fe5ec1f40b8ca9620ffe8b054458abfeb9ab74bbe9e0b0ecfa"},
 ]
 bs4 = [
     {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"},
@@ -3857,59 +2750,64 @@ celery-progress = [
     {file = "celery_progress-0.1.1-py3-none-any.whl", hash = "sha256:36a1e58b4408c9bf6aa63908204b50960b005db8e13f3c94ce6f8d6a2a4d4a6c"},
 ]
 certifi = [
-    {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
-    {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
+    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
+    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
 ]
 cffi = [
-    {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"},
-    {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"},
-    {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"},
-    {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"},
-    {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"},
-    {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"},
-    {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"},
-    {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"},
-    {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"},
-    {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"},
-    {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"},
-    {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"},
-    {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"},
-    {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"},
-    {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"},
-    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"},
-    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"},
-    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"},
-    {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"},
-    {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"},
-    {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"},
-    {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"},
-    {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"},
-    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"},
-    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"},
-    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"},
-    {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"},
-    {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"},
-    {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"},
-    {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"},
-    {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"},
-    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"},
-    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"},
-    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"},
-    {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"},
-    {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"},
-    {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"},
-    {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"},
-    {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"},
-    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"},
-    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"},
-    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"},
-    {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"},
-    {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"},
-    {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
+    {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
+    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
+    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
+    {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
+    {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
+    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
+    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
+    {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
+    {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
+    {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
+    {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
+    {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
+    {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
+    {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
+    {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
+    {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
+    {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
+    {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
+    {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
+    {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
+    {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
+    {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
+    {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
+    {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
+    {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
 ]
 charset-normalizer = [
-    {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"},
-    {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"},
+    {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"},
+    {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"},
 ]
 click = [
     {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
@@ -3939,77 +2837,61 @@ configobj = [
     {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"},
 ]
 coverage = [
-    {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
-    {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
-    {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"},
-    {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"},
-    {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"},
-    {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"},
-    {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"},
-    {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"},
-    {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"},
-    {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"},
-    {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"},
-    {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"},
-    {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"},
-    {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"},
-    {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"},
-    {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"},
-    {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"},
-    {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"},
-    {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"},
-    {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"},
-    {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"},
-    {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"},
-    {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"},
-    {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"},
-    {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"},
-    {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"},
-    {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"},
-    {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"},
-    {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"},
-    {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"},
-    {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"},
-    {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"},
-    {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"},
-    {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"},
-    {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"},
-    {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"},
-    {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"},
-    {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"},
-    {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"},
-    {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"},
-    {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"},
-    {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"},
-    {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"},
-    {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"},
-    {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"},
-    {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"},
-    {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"},
-    {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"},
-    {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"},
-    {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"},
-    {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"},
-    {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
+    {file = "coverage-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1549e1d08ce38259de2bc3e9a0d5f3642ff4a8f500ffc1b2df73fd621a6cdfc0"},
+    {file = "coverage-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcae10fccb27ca2a5f456bf64d84110a5a74144be3136a5e598f9d9fb48c0caa"},
+    {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:53a294dc53cfb39c74758edaa6305193fb4258a30b1f6af24b360a6c8bd0ffa7"},
+    {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8251b37be1f2cd9c0e5ccd9ae0380909c24d2a5ed2162a41fcdbafaf59a85ebd"},
+    {file = "coverage-6.0.2-cp310-cp310-win32.whl", hash = "sha256:db42baa892cba723326284490283a68d4de516bfb5aaba369b4e3b2787a778b7"},
+    {file = "coverage-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbffde2a68398682623d9dd8c0ca3f46fda074709b26fcf08ae7a4c431a6ab2d"},
+    {file = "coverage-6.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:60e51a3dd55540bec686d7fff61b05048ca31e804c1f32cbb44533e6372d9cc3"},
+    {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a6a9409223a27d5ef3cca57dd7cd4dfcb64aadf2fad5c3b787830ac9223e01a"},
+    {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4b34ae4f51bbfa5f96b758b55a163d502be3dcb24f505d0227858c2b3f94f5b9"},
+    {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3bbda1b550e70fa6ac40533d3f23acd4f4e9cb4e6e77251ce77fdf41b3309fb2"},
+    {file = "coverage-6.0.2-cp36-cp36m-win32.whl", hash = "sha256:4e28d2a195c533b58fc94a12826f4431726d8eb029ac21d874345f943530c122"},
+    {file = "coverage-6.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a82d79586a0a4f5fd1cf153e647464ced402938fbccb3ffc358c7babd4da1dd9"},
+    {file = "coverage-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3be1206dc09fb6298de3fce70593e27436862331a85daee36270b6d0e1c251c4"},
+    {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9cd3828bbe1a40070c11fe16a51df733fd2f0cb0d745fb83b7b5c1f05967df7"},
+    {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d036dc1ed8e1388e995833c62325df3f996675779541f682677efc6af71e96cc"},
+    {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04560539c19ec26995ecfb3d9307ff154fbb9a172cb57e3b3cfc4ced673103d1"},
+    {file = "coverage-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:e4fb7ced4d9dec77d6cf533acfbf8e1415fe799430366affb18d69ee8a3c6330"},
+    {file = "coverage-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:77b1da5767ed2f44611bc9bc019bc93c03fa495728ec389759b6e9e5039ac6b1"},
+    {file = "coverage-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61b598cbdbaae22d9e34e3f675997194342f866bb1d781da5d0be54783dce1ff"},
+    {file = "coverage-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36e9040a43d2017f2787b28d365a4bb33fcd792c7ff46a047a04094dc0e2a30d"},
+    {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f1627e162e3864a596486774876415a7410021f4b67fd2d9efdf93ade681afc"},
+    {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7a0b42db2a47ecb488cde14e0f6c7679a2c5a9f44814393b162ff6397fcdfbb"},
+    {file = "coverage-6.0.2-cp38-cp38-win32.whl", hash = "sha256:a1b73c7c4d2a42b9d37dd43199c5711d91424ff3c6c22681bc132db4a4afec6f"},
+    {file = "coverage-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1db67c497688fd4ba85b373b37cc52c50d437fd7267520ecd77bddbd89ea22c9"},
+    {file = "coverage-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f2f184bf38e74f152eed7f87e345b51f3ab0b703842f447c22efe35e59942c24"},
+    {file = "coverage-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1cf1deb3d5544bd942356364a2fdc8959bad2b6cf6eb17f47d301ea34ae822"},
+    {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad9b8c1206ae41d46ec7380b78ba735ebb77758a650643e841dd3894966c31d0"},
+    {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:381d773d896cc7f8ba4ff3b92dee4ed740fb88dfe33b6e42efc5e8ab6dfa1cfe"},
+    {file = "coverage-6.0.2-cp39-cp39-win32.whl", hash = "sha256:424c44f65e8be58b54e2b0bd1515e434b940679624b1b72726147cfc6a9fc7ce"},
+    {file = "coverage-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:abbff240f77347d17306d3201e14431519bf64495648ca5a49571f988f88dee9"},
+    {file = "coverage-6.0.2-pp36-none-any.whl", hash = "sha256:7092eab374346121805fb637572483270324407bf150c30a3b161fc0c4ca5164"},
+    {file = "coverage-6.0.2-pp37-none-any.whl", hash = "sha256:30922626ce6f7a5a30bdba984ad21021529d3d05a68b4f71ea3b16bda35b8895"},
+    {file = "coverage-6.0.2.tar.gz", hash = "sha256:6807947a09510dc31fa86f43595bf3a14017cd60bf633cc746d52141bfa6b149"},
 ]
 cryptography = [
-    {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"},
-    {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"},
-    {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"},
-    {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"},
-    {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"},
+    {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"},
+    {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"},
+    {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"},
+    {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"},
+    {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"},
+    {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"},
+    {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"},
+    {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"},
+    {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"},
+    {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"},
+    {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"},
+    {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"},
+    {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"},
+    {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"},
+    {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"},
+    {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"},
+    {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"},
+    {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"},
+    {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"},
+    {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"},
 ]
 curlylint = [
     {file = "curlylint-0.12.2-py3-none-any.whl", hash = "sha256:98bc15609ce858387dd70a28c7ddda96e82d0f1cb8bf51b8902532ce0fc1a97e"},
@@ -4032,8 +2914,8 @@ dj-database-url = [
     {file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"},
 ]
 django = [
-    {file = "Django-3.2.7-py3-none-any.whl", hash = "sha256:e93c93565005b37ddebf2396b4dc4b6913c1838baa82efdfb79acedd5816c240"},
-    {file = "Django-3.2.7.tar.gz", hash = "sha256:95b318319d6997bac3595517101ad9cc83fe5672ac498ba48d1a410f47afecd2"},
+    {file = "Django-3.2.8-py3-none-any.whl", hash = "sha256:42573831292029639b798fe4d3812996bfe4ff3275f04566da90764daec011a5"},
+    {file = "Django-3.2.8.tar.gz", hash = "sha256:f6d2c4069c9b9bfac03bedff927ea1f9e0d29e34525cec8a68fd28eb2a8df7af"},
 ]
 django-allauth = [
     {file = "django-allauth-0.45.0.tar.gz", hash = "sha256:6d46be0e1480316ccd45476db3aefb39db70e038d2a543112d314b76bb999a4e"},
@@ -4083,8 +2965,8 @@ django-cleanup = [
     {file = "django_cleanup-5.2.0-py2.py3-none-any.whl", hash = "sha256:193cf69de54b9fc0a0f4547edbb3a63bbe01728cb029f9f4b7912098cc1bced7"},
 ]
 django-colorfield = [
-    {file = "django-colorfield-0.4.3.tar.gz", hash = "sha256:218932da7275ded152d0119131efde72e33b52abf88be4c14f8ffea799a112c4"},
-    {file = "django_colorfield-0.4.3-py3-none-any.whl", hash = "sha256:7f1b5ef2417928b7f25708ff31db2d119d255d27cbea496dae62bbde35325aec"},
+    {file = "django-colorfield-0.4.5.tar.gz", hash = "sha256:66d7cb628d05c0eb09e25b0923e36bf6fbd3e339c568a199e66b34463119ca13"},
+    {file = "django_colorfield-0.4.5-py3-none-any.whl", hash = "sha256:579128d008b2d15e4df64f102b1ad58432de1b6f1017221c316d630e5c62960a"},
 ]
 django-dbbackup = [
     {file = "django-dbbackup-3.3.0.tar.gz", hash = "sha256:bb109735cae98b64ad084e5b461b7aca2d7b39992f10c9ed9435e3ebb6fb76c8"},
@@ -4094,8 +2976,8 @@ django-debug-toolbar = [
     {file = "django_debug_toolbar-3.2.2-py3-none-any.whl", hash = "sha256:d7bab7573fab35b0fd029163371b7182f5826c13da69734beb675c761d06a4d3"},
 ]
 django-dynamic-preferences = [
-    {file = "django-dynamic-preferences-1.10.1.tar.gz", hash = "sha256:e4b2bb7b2563c5064ba56dd76441c77e06b850ff1466a386a1cd308909a6c7de"},
-    {file = "django_dynamic_preferences-1.10.1-py2.py3-none-any.whl", hash = "sha256:9419fa925fd2cbb665269ae72059eb3058bf080913d853419b827e4e7a141902"},
+    {file = "django-dynamic-preferences-1.11.0.tar.gz", hash = "sha256:f214c938b5872a17647e2b2ccfd9ad00a90a3c6c4aa83fa65d3c5c446e7a66c7"},
+    {file = "django_dynamic_preferences-1.11.0-py2.py3-none-any.whl", hash = "sha256:31aecebcbfcfb970b78cfa3e5f8cc9f77638efe8e7c90f205a48b01c45ee5002"},
 ]
 django-extensions = [
     {file = "django-extensions-3.1.3.tar.gz", hash = "sha256:5f0fea7bf131ca303090352577a9e7f8bfbf5489bd9d9c8aea9401db28db34a0"},
@@ -4155,8 +3037,8 @@ django-menu-generator-ng = [
     {file = "django-menu-generator-ng-1.2.3.tar.gz", hash = "sha256:0c21a094b094add909655728b6b2d4a8baa5a2047da8f649be52589bea0e3ba2"},
 ]
 django-model-utils = [
-    {file = "django-model-utils-4.1.1.tar.gz", hash = "sha256:eb5dd05ef7d7ce6bc79cae54ea7c4a221f6f81e2aad7722933aee66489e7264b"},
-    {file = "django_model_utils-4.1.1-py3-none-any.whl", hash = "sha256:ef7c440024e797796a3811432abdd2be8b5225ae64ef346f8bfc6de7d8e5d73c"},
+    {file = "django-model-utils-4.2.0.tar.gz", hash = "sha256:e7a95e102f9c9653427eadab980d5d59e1dea972913b9c9e01ac37f86bba0ddf"},
+    {file = "django_model_utils-4.2.0-py3-none-any.whl", hash = "sha256:a768a25c80514e0ad4e4a6f9c02c44498985f36c5dfdea47b5b1e8cf994beba6"},
 ]
 django-oauth-toolkit = [
     {file = "django-oauth-toolkit-1.5.0.tar.gz", hash = "sha256:650e5ef2244d1d8db8f507137e0d1e8b8aad1f4086a4a610526e8851f9a38308"},
@@ -4195,15 +3077,15 @@ django-reversion = [
     {file = "django_reversion-4.0.0-py3-none-any.whl", hash = "sha256:f059c654e38c0dd8dccd7f0990aa2f6d9ad22dab55c5e095f9596aeda8079dcd"},
 ]
 django-sass-processor = [
-    {file = "django-sass-processor-1.1.tar.gz", hash = "sha256:16ae2116cbf174dbd1dc034b18b5a0abe7b0bb5fda20c33e9f710d47010ec972"},
+    {file = "django-sass-processor-1.0.0.tar.gz", hash = "sha256:cb90efee38cd7b0fe727c78d8993ad7804de33f40328200dfc1a481307ef0466"},
 ]
 django-select2 = [
-    {file = "django-select2-7.7.2.tar.gz", hash = "sha256:eb0bf31adcba9c31f26c2402cdce5b03f1cca0e218dd7da93e718b3c20127375"},
-    {file = "django_select2-7.7.2-py2.py3-none-any.whl", hash = "sha256:7be7c9e03e51ae8b1876826881b5d4009bb38c2da96b34f264fb90e5aceb54aa"},
+    {file = "django-select2-7.7.3.tar.gz", hash = "sha256:063d29df5598ec6549a4d49cc4beb85d585987a4e470224592034aff2d4f0a3f"},
+    {file = "django_select2-7.7.3-py2.py3-none-any.whl", hash = "sha256:7bf5b35595624a3318f46d69f639e38dafb123fa4a6f82d63a6a1ac6d532317d"},
 ]
 django-storages = [
-    {file = "django-storages-1.11.1.tar.gz", hash = "sha256:c823dbf56c9e35b0999a13d7e05062b837bae36c518a40255d522fbe3750fbb4"},
-    {file = "django_storages-1.11.1-py3-none-any.whl", hash = "sha256:f28765826d507a0309cfaa849bd084894bc71d81bf0d09479168d44785396f80"},
+    {file = "django-storages-1.12.2.tar.gz", hash = "sha256:0013ebe4904521e2fa28f33591a03a7210304d73363e7eadd7cdcf81c12ba003"},
+    {file = "django_storages-1.12.2-py3-none-any.whl", hash = "sha256:683b70617f4be9baa17b2d6d7df46cf6afe31b5eb17ece3ca82f773f555592a7"},
 ]
 django-stubs = [
     {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"},
@@ -4214,8 +3096,8 @@ django-stubs-ext = [
     {file = "django_stubs_ext-0.3.1-py3-none-any.whl", hash = "sha256:a51a3e9e844d4e1cacaaedbb33bf3def78a3956eed5d9575a640bd97ccd99cec"},
 ]
 django-tables2 = [
-    {file = "django-tables2-2.4.0.tar.gz", hash = "sha256:4eb526464ee56a0b7d827d1da9a4f257e44edb5e1cbb6a0cfb6ca0fed70d8e4f"},
-    {file = "django_tables2-2.4.0-py2.py3-none-any.whl", hash = "sha256:0f10ecef25708385a9d32d68d7c9478ca8dda31569410cb05a025be3f2c57593"},
+    {file = "django-tables2-2.4.1.tar.gz", hash = "sha256:6c72dd208358539e789e4c0efd7d151e43283a4aa4093a35f44c43489e7ddeaa"},
+    {file = "django_tables2-2.4.1-py2.py3-none-any.whl", hash = "sha256:50762bf3d7c61a4eb70e763c3e278650d7266bb78d0497fc8fafcf4e507c9a64"},
 ]
 django-templated-email = [
     {file = "django-templated-email-3.0.0.tar.gz", hash = "sha256:49d61840ec551e640adaf341146e94d6f9058ae01df964480850bf988046e5eb"},
@@ -4238,8 +3120,8 @@ django-uwsgi-ng = [
     {file = "django_uwsgi_ng-1.1.2-py3-none-any.whl", hash = "sha256:8b1a489a1ed9e56da0efadfa86ec306b532e5cd953fe34b234aaefc26898c649"},
 ]
 django-widget-tweaks = [
-    {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"},
-    {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"},
+    {file = "django-widget-tweaks-1.4.9.tar.gz", hash = "sha256:19bcb66a4a9e68493ced04e7124882d753c5be517ed001556f9e35a40147f545"},
+    {file = "django_widget_tweaks-1.4.9-py2.py3-none-any.whl", hash = "sha256:d6c64fbf92cd2df9031f597c1374982233c05a1190d295c39d1c57ce007569c7"},
 ]
 django-yarnpkg = [
     {file = "django-yarnpkg-6.0.1.tar.gz", hash = "sha256:aa059347b246c6f242401581d2c129bdcb45aa726be59fe2f288762a9843348a"},
@@ -4288,8 +3170,8 @@ flake8-fixme = [
     {file = "flake8_fixme-1.1.1-py2.py3-none-any.whl", hash = "sha256:226a6f2ef916730899f29ac140bed5d4a17e5aba79f00a0e3ae1eff1997cb1ac"},
 ]
 flake8-isort = [
-    {file = "flake8-isort-4.0.0.tar.gz", hash = "sha256:2b91300f4f1926b396c2c90185844eb1a3d5ec39ea6138832d119da0a208f4d9"},
-    {file = "flake8_isort-4.0.0-py2.py3-none-any.whl", hash = "sha256:729cd6ef9ba3659512dee337687c05d79c78e1215fdf921ed67e5fe46cce2f3c"},
+    {file = "flake8-isort-4.1.1.tar.gz", hash = "sha256:d814304ab70e6e58859bc5c3e221e2e6e71c958e7005239202fee19c24f82717"},
+    {file = "flake8_isort-4.1.1-py3-none-any.whl", hash = "sha256:c4e8b6dcb7be9b71a02e6e5d4196cefcef0f3447be51e82730fb336fff164949"},
 ]
 flake8-mypy = [
     {file = "flake8-mypy-17.8.0.tar.gz", hash = "sha256:47120db63aff631ee1f84bac6fe8e64731dc66da3efc1c51f85e15ade4a3ba18"},
@@ -4308,8 +3190,8 @@ freezegun = [
     {file = "freezegun-1.1.0.tar.gz", hash = "sha256:177f9dd59861d871e27a484c3332f35a6e3f5d14626f2bf91be37891f18927f3"},
 ]
 gitdb = [
-    {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"},
-    {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
+    {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
+    {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
 ]
 gitpython = [
     {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"},
@@ -4324,8 +3206,8 @@ html2text = [
     {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"},
 ]
 idna = [
-    {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
-    {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
+    {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
+    {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
 ]
 imagesize = [
     {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"},
@@ -4348,8 +3230,8 @@ jedi = [
     {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"},
 ]
 jinja2 = [
-    {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
-    {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
+    {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"},
+    {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"},
 ]
 jmespath = [
     {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"},
@@ -4503,71 +3385,59 @@ pexpect = [
     {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
 ]
 pg8000 = [
-    {file = "pg8000-1.21.2-py3-none-any.whl", hash = "sha256:e5cffa2a561c5196a69118cdb6e94b6915bf6cc069790a902652a8f52799f586"},
-    {file = "pg8000-1.21.2.tar.gz", hash = "sha256:36a3b517408334967c1fa0d29656da03608d63122a372ec92c85f49aed2d24e3"},
+    {file = "pg8000-1.22.0-py3-none-any.whl", hash = "sha256:a0e82542f4a56b2139c41ff09c1aeff294c10b6500bb6c57890c0c1c551cbc03"},
+    {file = "pg8000-1.22.0.tar.gz", hash = "sha256:c5172252fc92142ec104cd5e7231be4580a1a0a814403707bafbf7bb8383a29a"},
 ]
 phonenumbers = [
-    {file = "phonenumbers-8.12.33-py2.py3-none-any.whl", hash = "sha256:758d7f654b1eaec9a637510bf773b64833c6a417e7cf43ba9dccbcc2a16e44e1"},
-    {file = "phonenumbers-8.12.33.tar.gz", hash = "sha256:de3d5a3cb421c7421f584bb13cb9287e23ee2dd97d832fc35c9b55b96a576a3c"},
+    {file = "phonenumbers-8.12.35-py2.py3-none-any.whl", hash = "sha256:16c8f6d682ab5be550af2f4a2f81f0a90c8743e37babc7465edcefc106d0a1eb"},
+    {file = "phonenumbers-8.12.35.tar.gz", hash = "sha256:f426d419aabf6366c27ef1193918cc55217ef0e8be8f09cbf0667131037ca229"},
 ]
 pickleshare = [
     {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"},
     {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
 ]
 pillow = [
-    {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"},
-    {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"},
-    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"},
-    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"},
-    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"},
-    {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"},
-    {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"},
-    {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"},
-    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"},
-    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"},
-    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"},
-    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"},
-    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"},
-    {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"},
-    {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"},
-    {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"},
-    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"},
-    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"},
-    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"},
-    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"},
-    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"},
-    {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"},
-    {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"},
-    {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"},
-    {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"},
-    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"},
-    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"},
-    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"},
-    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"},
-    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"},
-    {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"},
-    {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"},
-    {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"},
-    {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"},
-    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"},
-    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"},
-    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"},
-    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"},
-    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"},
-    {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"},
-    {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"},
-    {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"},
-    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"},
-    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"},
-    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"},
-    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"},
-    {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"},
-    {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"},
+    {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"},
+    {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"},
+    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"},
+    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"},
+    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"},
+    {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"},
+    {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"},
+    {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"},
+    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"},
+    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"},
+    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"},
+    {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"},
+    {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"},
+    {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"},
+    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"},
+    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"},
+    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"},
+    {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"},
+    {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"},
+    {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"},
+    {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"},
+    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"},
+    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"},
+    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"},
+    {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"},
+    {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"},
+    {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"},
+    {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"},
+    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"},
+    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"},
+    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"},
+    {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"},
+    {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"},
+    {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"},
+    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"},
+    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"},
+    {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"},
+    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"},
+    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"},
+    {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"},
+    {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"},
 ]
 pluggy = [
     {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
@@ -4578,8 +3448,8 @@ prometheus-client = [
     {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"},
 ]
 prompt-toolkit = [
-    {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"},
-    {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"},
+    {file = "prompt_toolkit-3.0.21-py3-none-any.whl", hash = "sha256:62b3d3ea5a3ccee94dc1aac018279cf64866a76837156ebe159b981c42dd20a8"},
+    {file = "prompt_toolkit-3.0.21.tar.gz", hash = "sha256:27f13ff4e4850fe8f860b77414c7880f67c6158076a7b099062cc8570f1562e5"},
 ]
 psutil = [
     {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"},
@@ -4631,12 +3501,34 @@ py = [
     {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
 ]
 pyasn1 = [
+    {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"},
+    {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"},
+    {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"},
+    {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"},
     {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"},
+    {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"},
+    {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"},
+    {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"},
+    {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"},
+    {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"},
+    {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"},
+    {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"},
     {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"},
 ]
 pyasn1-modules = [
     {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"},
+    {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"},
+    {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"},
+    {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"},
+    {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"},
     {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"},
+    {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"},
+    {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"},
+    {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"},
+    {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"},
+    {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"},
+    {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"},
+    {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"},
 ]
 pycodestyle = [
     {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"},
@@ -4647,36 +3539,36 @@ pycparser = [
     {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
 ]
 pycryptodome = [
-    {file = "pycryptodome-3.10.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:91ba4215a1f37d0f371fe43bc88c5ff49c274849f3868321c889313787de7672"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:66301e4c42dee43ee2da256625d3fe81ef98cc9924c2bd535008cc3ad8ded77b"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8ec154ec445412df31acf0096e7f715e30e167c8f2318b8f5b1ab7c28f4c82f7"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8e82524e7c354033508891405574d12e612cc4fdd3b55d2c238fc1a3e300b606"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b217b4525e60e1af552d62bec01b4685095436d4de5ecde0f05d75b2f95ba6d4"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:3a153658d97258ca20bf18f7fe31c09cc7c558b6f8974a6ec74e19f6c634bd64"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-win32.whl", hash = "sha256:c6469d1453f5864e3321a172b0aa671b938d753cbf2376b99fa2ab8841539bb8"},
-    {file = "pycryptodome-3.10.4-cp27-cp27m-win_amd64.whl", hash = "sha256:6b45fcace5a5d9c57ba87cf804b161adc62aa826295ce7f7acbcbdc0df74ed37"},
-    {file = "pycryptodome-3.10.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b1daf251395af7336ddde6a0015ba5e632c18fe646ba930ef87402537358e3b4"},
-    {file = "pycryptodome-3.10.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9a2312440057bf29b9582f72f14d79692044e63bfbc4b4bbea8559355f44f3dd"},
-    {file = "pycryptodome-3.10.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:54d4e4d45f349d8c4e2f31c2734637ff62a844af391b833f789da88e43a8f338"},
-    {file = "pycryptodome-3.10.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:97e7df67a4da2e3f60612bbfd6c3f243a63a15d8f4797dd275e1d7b44a65cb12"},
-    {file = "pycryptodome-3.10.4-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:db15fa07d2a4c00beeb5e9acdfdbc1c79f9ccfbdc1a8f36c82c4aa44951b33c9"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:217dcc0c92503f7dd4b3d3b7d974331a4419f97f555c99a845c3b366fed7056b"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-manylinux1_i686.whl", hash = "sha256:a7471646d8cd1a58bb696d667dcb3853e5c9b341b68dcf3c3cc0893d0f98ca5f"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:d713dc0910e5ded07852a05e9b75f1dd9d3a31895eebee0668f612779b2a748c"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:ac3012c36633564b2b5539bb7c6d9175f31d2ce74844e9abe654c428f02d0fd8"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:3f9fb499e267039262569d08658132c9cd8b136bf1d8c56b72f70ed05551e526"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:309529d2526f3fb47102aeef376b3459110a6af7efb162e860b32e3a17a46f06"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-win32.whl", hash = "sha256:7efec2418e9746ec48e264eea431f8e422d931f71c57b1c96ee202b117f58fa9"},
-    {file = "pycryptodome-3.10.4-cp35-abi3-win_amd64.whl", hash = "sha256:49e54f2245befb0193848c8c8031d8d1358ed4af5a1ae8d0a3ba669a5cdd3a72"},
-    {file = "pycryptodome-3.10.4-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:4e8fc4c48365ce8a542fe48bf1360da05bb2851df12f64fc94d751705e7cdbe7"},
-    {file = "pycryptodome-3.10.4-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:851e6d4930b160417235955322db44adbdb19589918670d63f4acd5d92959ac0"},
-    {file = "pycryptodome-3.10.4-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:04e14c732c3693d2830839feed5129286ce47ffa8bfe90e4ae042c773e51c677"},
-    {file = "pycryptodome-3.10.4-pp27-pypy_73-win32.whl", hash = "sha256:cefe6b267b8e5c3c72e11adec35a9c7285b62e8ea141b63e87055e9a9e5f2f8c"},
-    {file = "pycryptodome-3.10.4-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:24c1b7705d19d8ae3e7255431efd2e526006855df62620118dd7b5374c6372f6"},
-    {file = "pycryptodome-3.10.4-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:c61ea053bd5d4c12a063d7e704fbe1c45abb5d2510dab55bd95d166ba661604f"},
-    {file = "pycryptodome-3.10.4-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:11d3164fb49fdee000fde05baecce103c0c698168ef1a18d9c7429dd66f0f5bb"},
-    {file = "pycryptodome-3.10.4-pp36-pypy36_pp73-win32.whl", hash = "sha256:3faa6ebd35c61718f3f8862569c1f38450c24f3ededb213e1a64806f02f584bc"},
-    {file = "pycryptodome-3.10.4.tar.gz", hash = "sha256:40083b0d7f277452c7f2dd4841801f058cc12a74c219ee4110d65774c6a58bef"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ffd0cac13ff41f2d15ed39dc6ba1d2ad88dd2905d656c33d8235852f5d6151fd"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:ead516e03dfe062aefeafe4a29445a6449b0fc43bc8cb30194b2754917a63798"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4ce6b09547bf2c7cede3a017f79502eaed3e819c13cdb3cb357aea1b004e4cc6"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:014c758af7fa38cab85b357a496b76f4fc9dda1f731eb28358d66fef7ad4a3e1"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a843350d08c3d22f6c09c2f17f020d8dcfa59496165d7425a3fba0045543dda7"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:53989477044be41fa4a63da09d5038c2a34b2f4554cfea2e3933b17186ee9e19"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-win32.whl", hash = "sha256:f9bad2220b80b4ed74f089db012ab5ab5419143a33fad6c8aedcc2a9341eac70"},
+    {file = "pycryptodome-3.11.0-cp27-cp27m-win_amd64.whl", hash = "sha256:3c7ed5b07274535979c730daf5817db5e983ea80b04c22579eee8da4ca3ae4f8"},
+    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:8f3a60926be78422e662b0d0b18351b426ce27657101c8a50bad80300de6a701"},
+    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:fce7e22d96030b35345637c563246c24d4513bd3b413e1c40293114837ab8912"},
+    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:bc3c61ff92efdcc14af4a7b81da71d849c9acee51d8fd8ac9841a7620140d6c6"},
+    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:b33c9b3d1327d821e28e9cc3a6512c14f8b17570ddb4cfb9a52247ed0fcc5d8b"},
+    {file = "pycryptodome-3.11.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:75e78360d1dd6d02eb288fd8275bb4d147d6e3f5337935c096d11dba1fa84748"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:621a90147a5e255fdc2a0fec2d56626b76b5d72ea9e60164c9a5a8976d45b0c9"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:0ca7a6b4fc1f9fafe990b95c8cda89099797e2cfbf40e55607f2f2f5a3355dcb"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b59bf823cfafde8ef1105d8984f26d1694dff165adb7198b12e3e068d7999b15"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:ce81b9c6aaa0f920e2ab05eb2b9f4ccd102e3016b2f37125593b16a83a4b0cc2"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ae29fcd56152f417bfba50a36a56a7a5f9fb74ff80bab98704cac704de6568ab"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:ae31cb874f6f0cedbed457c6374e7e54d7ed45c1a4e11a65a9c80968da90a650"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-win32.whl", hash = "sha256:6db1f9fa1f52226621905f004278ce7bd90c8f5363ffd5d7ab3755363d98549a"},
+    {file = "pycryptodome-3.11.0-cp35-abi3-win_amd64.whl", hash = "sha256:d7e5f6f692421e5219aa3b545eb0cffd832cd589a4b9dcd4a5eb4260e2c0d68a"},
+    {file = "pycryptodome-3.11.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:da796e9221dda61a0019d01742337eb8a322de8598b678a4344ca0a436380315"},
+    {file = "pycryptodome-3.11.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ed45ef92d21db33685b789de2c015e9d9a18a74760a8df1fc152faee88cdf741"},
+    {file = "pycryptodome-3.11.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4169ed515742425ff21e4bd3fabbb6994ffb64434472fb72230019bdfa36b939"},
+    {file = "pycryptodome-3.11.0-pp27-pypy_73-win32.whl", hash = "sha256:f19edd42368e9057c39492947bb99570dc927123e210008f2af7cf9b505c6892"},
+    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06162fcfed2f9deee8383fd59eaeabc7b7ffc3af50d3fad4000032deb8f700b0"},
+    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:6eda8a3157c91ba60b26a07bedd6c44ab8bda6cd79b6b5ea9744ba62c39b7b1e"},
+    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ff701fc283412e651eaab4319b3cd4eaa0827e94569cd37ee9075d5c05fe655"},
+    {file = "pycryptodome-3.11.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:2a4bcc8a9977fee0979079cd33a9e9f0d3ddba5660d35ffe874cf84f1dd399d2"},
+    {file = "pycryptodome-3.11.0.tar.gz", hash = "sha256:428096bbf7a77e207f418dfd4d7c284df8ade81d2dc80f010e92753a3e406ad0"},
 ]
 pydocstyle = [
     {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
@@ -4691,12 +3583,12 @@ pygments = [
     {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
 ]
 pyjwt = [
-    {file = "PyJWT-2.1.0-py3-none-any.whl", hash = "sha256:934d73fbba91b0483d3857d1aff50e96b2a892384ee2c17417ed3203f173fca1"},
-    {file = "PyJWT-2.1.0.tar.gz", hash = "sha256:fba44e7898bbca160a2b2b501f492824fc8382485d3a6f11ba5d0c1937ce6130"},
+    {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"},
+    {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"},
 ]
 pyparsing = [
-    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
-    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
+    {file = "pyparsing-3.0.1-py3-none-any.whl", hash = "sha256:fd93fc45c47893c300bd98f5dd1b41c0e783eaeb727e7cea210dcc09d64ce7c3"},
+    {file = "pyparsing-3.0.1.tar.gz", hash = "sha256:84196357aa3566d64ad123d7a3c67b0e597a115c4934b097580e5ce220b91531"},
 ]
 pytest = [
     {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
@@ -4718,7 +3610,7 @@ pytest-sugar = [
     {file = "pytest-sugar-0.9.4.tar.gz", hash = "sha256:b1b2186b0a72aada6859bea2a5764145e3aaa2c1cfbb23c3a19b5f7b697563d3"},
 ]
 python-crontab = [
-    {file = "python-crontab-2.5.1.tar.gz", hash = "sha256:4bbe7e720753a132ca4ca9d4094915f40e9d9dc8a807a4564007651018ce8c31"},
+    {file = "python-crontab-2.6.0.tar.gz", hash = "sha256:1e35ed7a3cdc3100545b43e196d34754e6551e7f95e4caebbe0e1c0ca41c2f1b"},
 ]
 python-dateutil = [
     {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
@@ -4736,39 +3628,43 @@ python3-openid = [
     {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"},
 ]
 pytz = [
-    {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
-    {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
+    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
+    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
 ]
 pyyaml = [
-    {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
-    {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"},
-    {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"},
-    {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
-    {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
-    {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
-    {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
-    {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
-    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
-    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
-    {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
-    {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
-    {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
-    {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
-    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
-    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
-    {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
-    {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
-    {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
 ]
 qrcode = [
     {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"},
@@ -4779,47 +3675,42 @@ redis = [
     {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"},
 ]
 regex = [
-    {file = "regex-2021.9.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66696c8336a1b5d1182464f3af3427cc760118f26d0b09a2ddc16a976a4d2637"},
-    {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d87459ad3ab40cd8493774f8a454b2e490d8e729e7e402a0625867a983e4e02"},
-    {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf6a1e023caf5e9a982f5377414e1aeac55198831b852835732cfd0a0ca5ff"},
-    {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:255791523f80ea8e48e79af7120b4697ef3b74f6886995dcdb08c41f8e516be0"},
-    {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e502f8d4e5ef714bcc2c94d499684890c94239526d61fdf1096547db91ca6aa6"},
-    {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4907fb0f9b9309a5bded72343e675a252c2589a41871874feace9a05a540241e"},
-    {file = "regex-2021.9.30-cp310-cp310-win32.whl", hash = "sha256:3be40f720af170a6b20ddd2ad7904c58b13d2b56f6734ee5d09bbdeed2fa4816"},
-    {file = "regex-2021.9.30-cp310-cp310-win_amd64.whl", hash = "sha256:c2b180ed30856dfa70cfe927b0fd38e6b68198a03039abdbeb1f2029758d87e7"},
-    {file = "regex-2021.9.30-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6f2d2f93001801296fe3ca86515eb04915472b5380d4d8752f09f25f0b9b0ed"},
-    {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa7ba9ab2eba7284e0d7d94f61df7af86015b0398e123331362270d71fab0b9"},
-    {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28040e89a04b60d579c69095c509a4f6a1a5379cd865258e3a186b7105de72c6"},
-    {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f588209d3e4797882cd238195c175290dbc501973b10a581086b5c6bcd095ffb"},
-    {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42952d325439ef223e4e9db7ee6d9087b5c68c5c15b1f9de68e990837682fc7b"},
-    {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cae4099031d80703954c39680323dabd87a69b21262303160776aa0e55970ca0"},
-    {file = "regex-2021.9.30-cp36-cp36m-win32.whl", hash = "sha256:0de8ad66b08c3e673b61981b9e3626f8784d5564f8c3928e2ad408c0eb5ac38c"},
-    {file = "regex-2021.9.30-cp36-cp36m-win_amd64.whl", hash = "sha256:b345ecde37c86dd7084c62954468a4a655fd2d24fd9b237949dd07a4d0dd6f4c"},
-    {file = "regex-2021.9.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6f08187136f11e430638c2c66e1db091105d7c2e9902489f0dbc69b44c222b4"},
-    {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55442650f541d195a535ccec33078c78a9521973fb960923da7515e9ed78fa6"},
-    {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e9c489aa98f50f367fb26cc9c8908d668e9228d327644d7aa568d47e456f47"},
-    {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2cb7d4909ed16ed35729d38af585673f1f0833e73dfdf0c18e5be0061107b99"},
-    {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0861e7f6325e821d5c40514c551fd538b292f8cc3960086e73491b9c5d8291d"},
-    {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:81fdc90f999b2147fc62e303440c424c47e5573a9b615ed5d43a5b832efcca9e"},
-    {file = "regex-2021.9.30-cp37-cp37m-win32.whl", hash = "sha256:8c1ad61fa024195136a6b7b89538030bd00df15f90ac177ca278df9b2386c96f"},
-    {file = "regex-2021.9.30-cp37-cp37m-win_amd64.whl", hash = "sha256:e3770781353a4886b68ef10cec31c1f61e8e3a0be5f213c2bb15a86efd999bc4"},
-    {file = "regex-2021.9.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c065d95a514a06b92a5026766d72ac91bfabf581adb5b29bc5c91d4b3ee9b83"},
-    {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9925985be05d54b3d25fd6c1ea8e50ff1f7c2744c75bdc4d3b45c790afa2bcb3"},
-    {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470f2c882f2672d8eeda8ab27992aec277c067d280b52541357e1acd7e606dae"},
-    {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0517df22a97f1da20d8f1c8cb71a5d1997fa383326b81f9cf22c9dadfbdf34"},
-    {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e30838df7bfd20db6466fd309d9b580d32855f8e2c2e6d74cf9da27dcd9b63"},
-    {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b34d2335d6aedec7dcadd3f8283b9682fadad8b9b008da8788d2fce76125ebe"},
-    {file = "regex-2021.9.30-cp38-cp38-win32.whl", hash = "sha256:e07049cece3462c626d650e8bf42ddbca3abf4aa08155002c28cb6d9a5a281e2"},
-    {file = "regex-2021.9.30-cp38-cp38-win_amd64.whl", hash = "sha256:37868075eda024470bd0feab872c692ac4ee29db1e14baec103257bf6cc64346"},
-    {file = "regex-2021.9.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d331f238a7accfbbe1c4cd1ba610d4c087b206353539331e32a8f05345c74aec"},
-    {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6348a7ab2a502cbdd0b7fd0496d614007489adb7361956b38044d1d588e66e04"},
-    {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b1cca6c23f19bee8dc40228d9c314d86d1e51996b86f924aca302fc8f8bf9"},
-    {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f1125bc5172ab3a049bc6f4b9c0aae95a2a2001a77e6d6e4239fa3653e202b5"},
-    {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:638e98d069b14113e8afba6a54d1ca123f712c0d105e67c1f9211b2a825ef926"},
-    {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a0b0db6b49da7fa37ca8eddf9f40a8dbc599bad43e64f452284f37b6c34d91c"},
-    {file = "regex-2021.9.30-cp39-cp39-win32.whl", hash = "sha256:9910869c472e5a6728680ca357b5846546cbbd2ab3ad5bef986ef0bc438d0aa6"},
-    {file = "regex-2021.9.30-cp39-cp39-win_amd64.whl", hash = "sha256:3b71213ec3bad9a5a02e049f2ec86b3d7c3e350129ae0f4e2f99c12b5da919ed"},
-    {file = "regex-2021.9.30.tar.gz", hash = "sha256:81e125d9ba54c34579e4539a967e976a3c56150796674aec318b1b2f49251be7"},
+    {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"},
+    {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"},
+    {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"},
+    {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"},
+    {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"},
+    {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"},
+    {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"},
+    {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"},
+    {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"},
+    {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"},
+    {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"},
+    {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"},
+    {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"},
+    {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"},
+    {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"},
+    {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"},
+    {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"},
+    {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"},
+    {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"},
+    {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"},
+    {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"},
+    {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"},
+    {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"},
+    {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"},
+    {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"},
+    {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"},
+    {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"},
+    {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"},
+    {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"},
+    {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"},
+    {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"},
+    {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"},
+    {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"},
+    {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"},
+    {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"},
+    {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"},
 ]
 requests = [
     {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
@@ -4828,6 +3719,7 @@ requests = [
 requests-oauthlib = [
     {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"},
     {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"},
+    {file = "requests_oauthlib-1.3.0-py3.7.egg", hash = "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc"},
 ]
 restructuredtext-lint = [
     {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
@@ -4883,8 +3775,8 @@ six = [
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
 smmap = [
-    {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"},
-    {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"},
+    {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
+    {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
 ]
 snowballstemmer = [
     {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
@@ -4942,8 +3834,8 @@ sqlparse = [
     {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
 ]
 stevedore = [
-    {file = "stevedore-3.4.0-py3-none-any.whl", hash = "sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e"},
-    {file = "stevedore-3.4.0.tar.gz", hash = "sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1"},
+    {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"},
+    {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"},
 ]
 termcolor = [
     {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
@@ -4965,11 +3857,11 @@ toml = [
     {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
 ]
 traitlets = [
-    {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"},
-    {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"},
+    {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"},
+    {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"},
 ]
 twilio = [
-    {file = "twilio-7.0.0.tar.gz", hash = "sha256:6cff34d61c3fad9d41e21b4b59527996fb7f0c6eeb5f001b90040b630fbf8446"},
+    {file = "twilio-7.2.0.tar.gz", hash = "sha256:f99643641c193fcd09b58f20ef65a78937e5c426319530a42c325b3abd80e739"},
 ]
 typed-ast = [
     {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
@@ -5004,12 +3896,12 @@ typed-ast = [
     {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
 ]
 types-pytz = [
-    {file = "types-pytz-2021.1.2.tar.gz", hash = "sha256:448828a06f2aaa840e57364d866c661645a045e532f817e4f10c8c3ab2b66651"},
-    {file = "types_pytz-2021.1.2-py3-none-any.whl", hash = "sha256:28fb1c0f77f59aebe9b792d073ebfbbbf7b329f9d4af6a6079713a618a1c0f31"},
+    {file = "types-pytz-2021.3.0.tar.gz", hash = "sha256:86a61967834dceeaaf98b6902ed8357efdd262bb8afcaf4bc8ccecf748592778"},
+    {file = "types_pytz-2021.3.0-py3-none-any.whl", hash = "sha256:b5027e5de50a4c978cd60ca16849d934d44c44ebd7d29cf13ada009efaa9feef"},
 ]
 types-pyyaml = [
-    {file = "types-PyYAML-5.4.10.tar.gz", hash = "sha256:1d9e431e9f1f78a65ea957c558535a3b15ad67ea4912bce48a6c1b613dcf81ad"},
-    {file = "types_PyYAML-5.4.10-py3-none-any.whl", hash = "sha256:f1d1357168988e45fa20c65aecb3911462246a84809015dd889ebf8b1db74124"},
+    {file = "types-PyYAML-6.0.0.tar.gz", hash = "sha256:3d3591ddfc488fc30be3c506a0c0fe54da968fe98d8b76ab12e59d455330ffca"},
+    {file = "types_PyYAML-6.0.0-py3-none-any.whl", hash = "sha256:746f23d351245d176d7bc89eef79e2ee94b4e7306f7d23bfefb3dc946c0fb58d"},
 ]
 typing-extensions = [
     {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
@@ -5021,7 +3913,7 @@ urllib3 = [
     {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
 ]
 uwsgi = [
-    {file = "uWSGI-2.0.19.1.tar.gz", hash = "sha256:faa85e053c0b1be4d5585b0858d3a511d2cd10201802e8676060fd0a109e5869"},
+    {file = "uwsgi-2.0.20.tar.gz", hash = "sha256:88ab9867d8973d8ae84719cf233b7dafc54326fcaec89683c3f9f77c002cdff9"},
 ]
 vine = [
     {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"},
@@ -5041,7 +3933,50 @@ whoosh = [
     {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"},
 ]
 wrapt = [
-    {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
+    {file = "wrapt-1.13.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a"},
+    {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7"},
+    {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1"},
+    {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b"},
+    {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b"},
+    {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468"},
+    {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0"},
+    {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2"},
+    {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1"},
+    {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f"},
+    {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108"},
+    {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0"},
+    {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1"},
+    {file = "wrapt-1.13.2-cp35-cp35m-win32.whl", hash = "sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9"},
+    {file = "wrapt-1.13.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52"},
+    {file = "wrapt-1.13.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c"},
+    {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32"},
+    {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a"},
+    {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2"},
+    {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e"},
+    {file = "wrapt-1.13.2-cp36-cp36m-win32.whl", hash = "sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7"},
+    {file = "wrapt-1.13.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48"},
+    {file = "wrapt-1.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580"},
+    {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4"},
+    {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0"},
+    {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006"},
+    {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70"},
+    {file = "wrapt-1.13.2-cp37-cp37m-win32.whl", hash = "sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb"},
+    {file = "wrapt-1.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4"},
+    {file = "wrapt-1.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831"},
+    {file = "wrapt-1.13.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867"},
+    {file = "wrapt-1.13.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724"},
+    {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808"},
+    {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90"},
+    {file = "wrapt-1.13.2-cp38-cp38-win32.whl", hash = "sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a"},
+    {file = "wrapt-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528"},
+    {file = "wrapt-1.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe"},
+    {file = "wrapt-1.13.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7"},
+    {file = "wrapt-1.13.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38"},
+    {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9"},
+    {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e"},
+    {file = "wrapt-1.13.2-cp39-cp39-win32.whl", hash = "sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072"},
+    {file = "wrapt-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef"},
+    {file = "wrapt-1.13.2.tar.gz", hash = "sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447"},
 ]
 yubiotp = [
     {file = "YubiOTP-1.0.0.post1-py2.py3-none-any.whl", hash = "sha256:7ad57011866e0bc6c6d179ffbc3926fcc0e82d410178a6d01ba4da0f88332878"},
diff --git a/pyproject.toml b/pyproject.toml
index 49b6de089c2c5d9202f6b604211cc35ae51bd369..7de56924b6d76c659ab4da8762e25e6815b9f435 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -52,8 +52,8 @@ django-any-js = "^1.1"
 django-debug-toolbar = "^3.2"
 django-menu-generator-ng = "^1.2.3"
 django-tables2 = "^2.1"
-django-phonenumber-field = {version = "<5.3", extras = ["phonenumbers"]}
-django-sass-processor = "^1.0"
+django-phonenumber-field = {version = "^5.2", extras = ["phonenumbers"]}
+django-sass-processor = "1.0"
 libsass = "^0.21.0"
 colour = "^0.1.5"
 dynaconf = {version = "^3.1", extras = ["yaml", "toml", "ini"]}
@@ -66,7 +66,7 @@ django_select2 = "^7.1"
 django-two-factor-auth = { version = "^1.12.1", extras = [ "yubikey", "phonenumbers", "call", "sms" ] }
 django-yarnpkg = "^6.0"
 django-material = "^1.6.0"
-django-dynamic-preferences = "^1.9"
+django-dynamic-preferences = "^1.11"
 django_widget_tweaks = "^1.4.5"
 django-filter = "^2.2.0"
 django-templated-email = "^3.0.0"