diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 0b8bd7127d4559a8e386c96c2ae5347646c9fb7c..8e5936c5590cc6cf11a820389e5e77bf6cba993c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -6,6 +6,20 @@ All notable changes to this project will be documented in this file.
 The format is based on `Keep a Changelog`_,
 and this project adheres to `Semantic Versioning`_.
 
+`2.0rc3`_ - 2021-09-24
+----------------------
+
+Changed
+~~~~~~~
+
+* Support dates for ``TimePeriod.get_datetime_start`` and ``TimePeriod.get_datetime_end``.
+* Update translations.
+
+Fixed
+~~~~~
+
+* ``Event.__str__`` returned a proxy type instead a string.
+
 `2.0rc2`_ - 2021-08-01
 ----------
 
@@ -196,3 +210,4 @@ Fixed
 .. _2.0b3: https://edugit.org/AlekSIS/Official/AlekSIS-App-Chronos/-/tags/2.0b3
 .. _2.0rc1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Chronos/-/tags/2.0rc1
 .. _2.0rc2: https://edugit.org/AlekSIS/Official/AlekSIS-App-Chronos/-/tags/2.0rc2
+.. _2.0rc3: https://edugit.org/AlekSIS/Official/AlekSIS-App-Chronos/-/tags/2.0rc3
diff --git a/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
index 631b70a62a2f021bfb9288681747b7e41eb50d71..4e1c14753d8fb02b0790d4acc55d6d23cb7b04d0 100644
--- a/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-06-08 16:49+0200\n"
+"POT-Creation-Date: 2021-09-24 20:48+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"
@@ -54,15 +54,15 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr ""
 
@@ -70,17 +70,17 @@ msgstr ""
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr ""
 
@@ -120,300 +120,300 @@ msgstr ""
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
+msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr ""
 
@@ -478,7 +478,7 @@ msgid "Delete"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr ""
 
@@ -535,20 +535,20 @@ msgid "Print: Substitutions"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr ""
 
@@ -560,14 +560,14 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr ""
 
diff --git a/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
index f4faec72c0aaa11081708a66e54093cd9a5cfc84..ca85e46149f422c452c98527fcbb0ad7470bb4ca 100644
--- a/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-06-08 16:49+0200\n"
-"PO-Revision-Date: 2021-06-12 10:41+0000\n"
+"PO-Revision-Date: 2021-09-24 19:24+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/"
 "aleksis-app-chronos/de/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "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/apps/chronos/forms.py:29
 msgid "Options for timetables"
@@ -55,15 +55,15 @@ msgstr "Vertretungen"
 msgid "Linked validity range"
 msgstr "Zugeordneter Gültigkeitsbereich"
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr "Ankündigungen in Stundenplanansichten anzeigen?"
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr "Kann Gruppenstundenpläne sehen"
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr "Kann Personenstundenpläne sehen"
 
@@ -71,17 +71,17 @@ msgstr "Kann Personenstundenpläne sehen"
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr "Enddatum"
 
@@ -121,300 +121,300 @@ msgstr "Startzeit"
 msgid "End time"
 msgstr "Endzeit"
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr "Stunde"
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr "Stunden"
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr "Vordergrundfarbe"
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr "Hintergrundfarbe"
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Fach"
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 msgid "Subjects"
 msgstr "Fächer"
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr "Kann Raumstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr "Raum"
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr "Räume"
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr "Lehrkräfte"
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr "Stunden"
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr "Unterrichtsstunde"
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr "Unterrichtsstunden"
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
-msgstr "Woche"
+msgstr "KW"
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr "Jahr"
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr "Unterrichtsstunde"
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr "Entfällt?"
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr "Entfällt für Lehrkräfte?"
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr "Kommentar"
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr "Unterrichtsstunden können nur entweder vertreten werden oder ausfallen."
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr "Vertretung"
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr "Vertretungen"
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr "Unterrichtsstunden"
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr "Stundenplanwidget"
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr "Stundenplanwidgets"
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr "Absenzgrund"
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr "Absenzgründe"
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
 msgstr "Lehrkraft"
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
 msgstr "Gruppe"
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr "Startstunde"
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr "Unbekannte Absenz"
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr "Absenz"
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr "Fehlstunden"
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr "Datum der Klausur"
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr "Klausur"
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr "Klausuren"
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr "Kommentare"
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr "Ferien"
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr "Ferien"
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr "Aufsichtsgebiet"
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr "Aufsichtsgebiete"
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr "Stunde, nach der die Pause startet"
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr "Stunde nach der Pause"
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr "Pause"
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr "Pausen"
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr "Aufsicht"
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr "Aufsichten"
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr "Aufsichtsvertretung"
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr "Aufsichtsvertretungen"
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr "Startstunde"
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
-msgstr "Veranstaltung {self.pk}"
+msgid "Event {pk}"
+msgstr "Veranstaltung {pk}"
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr "Veranstaltung"
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr "Veranstaltungen"
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr "Sonderstunde"
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr "Sonderstunden"
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr "Kann alle Raumstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr "Kann alle Gruppenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr "Kann alle Personenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr "Kann Stundenplanübersicht sehen"
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr "Kann alle Tagesstunden sehen"
 
@@ -440,9 +440,7 @@ msgstr "Anzahl der Gruppen, ab der gekürzt wird"
 
 #: aleksis/apps/chronos/preferences.py:40
 msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
-msgstr ""
-"Wenn ein Benutzer die Kürzung von Gruppen aktiviert hat, werden sie ab "
-"diesem Limit gekürzt."
+msgstr "Wenn ein Benutzer die Kürzung von Gruppen aktiviert hat, werden sie ab diesem Limit gekürzt."
 
 #: aleksis/apps/chronos/preferences.py:50
 msgid "Number of days shown on substitutions print view"
@@ -481,7 +479,7 @@ msgid "Delete"
 msgstr "Löschen"
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr "SMART PLAN"
 
@@ -538,20 +536,20 @@ msgid "Print: Substitutions"
 msgstr "Druckansicht: Vertretungen"
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr "Stundenplan"
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr "Gruppenlehrkräfte:"
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr "Regulären Plan anzeigen"
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr "SMART PLAN anzeigen"
 
@@ -566,17 +564,17 @@ msgstr ""
 "        Mein Stundenplan für %(day)s\n"
 "      "
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 "\n"
-"              Es gibt keine Stundenplan, der Ihrer Person zugeordnet ist.\n"
-"            "
+"          Es gibt keine Stundenplan, der Ihrer Person zugeordnet ist.\n"
+"          "
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr "SMART PLAN anzeigen"
 
diff --git a/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
index 1d890ce4e1804daf92d20fb0b5eccd5d01a2dbd7..41c6b5309394271c000e5716497a4cf23cab4a0a 100644
--- a/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
@@ -8,15 +8,16 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-06-08 16:49+0200\n"
-"PO-Revision-Date: 2020-04-29 12:01+0000\n"
-"Last-Translator: Marlene Grundey <grundema@katharineum.de>\n"
-"Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/fr/>\n"
+"PO-Revision-Date: 2021-06-16 11:59+0000\n"
+"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
+"Language-Team: French <https://translate.edugit.org/projects/aleksis/"
+"aleksis-app-chronos/fr/>\n"
 "Language: fr\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.0.1\n"
+"X-Generator: Weblate 4.4\n"
 
 #: aleksis/apps/chronos/forms.py:29
 msgid "Options for timetables"
@@ -54,15 +55,15 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr ""
 
@@ -70,17 +71,17 @@ msgstr ""
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr ""
 
@@ -120,302 +121,302 @@ msgstr ""
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 #, fuzzy
 #| msgid "Subject"
 msgid "Subjects"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr "Salle"
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr "Profs"
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr "Cours"
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
-msgstr "Profs"
+msgstr "prof"
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
-msgstr ""
+msgstr "groupe"
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr "Absences"
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
+msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr ""
 
@@ -480,7 +481,7 @@ msgid "Delete"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr ""
 
@@ -537,20 +538,20 @@ msgid "Print: Substitutions"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr ""
 
@@ -562,14 +563,14 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr ""
 
diff --git a/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
index d8c87e1f24f0e8100e5629f717f493108da57e87..3592ff8574a9e5988f04a6c1ce942e1e5880a488 100644
--- a/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/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-06-08 16:49+0200\n"
+"POT-Creation-Date: 2021-09-24 20:48+0200\n"
 "PO-Revision-Date: 2020-08-23 13:49+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/la/>\n"
@@ -54,15 +54,15 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr ""
 
@@ -70,17 +70,17 @@ msgstr ""
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr ""
 
@@ -120,300 +120,300 @@ msgstr ""
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
+msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr ""
 
@@ -478,7 +478,7 @@ msgid "Delete"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr ""
 
@@ -535,20 +535,20 @@ msgid "Print: Substitutions"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr ""
 
@@ -560,14 +560,14 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr ""
 
diff --git a/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po
index 7dee014a4b09bffaafd6ecb297a9878b962cc7ce..ba2c9834560d0efe54886e78dbec6bc883697d24 100644
--- a/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-06-08 16:49+0200\n"
+"POT-Creation-Date: 2021-09-24 20:48+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"
@@ -53,15 +53,15 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr ""
 
@@ -69,17 +69,17 @@ msgstr ""
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr ""
 
@@ -119,300 +119,300 @@ msgstr ""
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
+msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr ""
 
@@ -477,7 +477,7 @@ msgid "Delete"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr ""
 
@@ -534,20 +534,20 @@ msgid "Print: Substitutions"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr ""
 
@@ -559,14 +559,14 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr ""
 
diff --git a/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po
index 7dee014a4b09bffaafd6ecb297a9878b962cc7ce..ba2c9834560d0efe54886e78dbec6bc883697d24 100644
--- a/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-06-08 16:49+0200\n"
+"POT-Creation-Date: 2021-09-24 20:48+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"
@@ -53,15 +53,15 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:133
+#: aleksis/apps/chronos/model_extensions.py:137
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:141
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:144
+#: aleksis/apps/chronos/model_extensions.py:148
 msgid "Can view person timetable"
 msgstr ""
 
@@ -69,17 +69,17 @@ msgstr ""
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:617
+#: aleksis/apps/chronos/models.py:74 aleksis/apps/chronos/models.py:627
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:672
-#: aleksis/apps/chronos/models.py:744 aleksis/apps/chronos/models.py:956
+#: aleksis/apps/chronos/models.py:76 aleksis/apps/chronos/models.py:682
+#: aleksis/apps/chronos/models.py:754 aleksis/apps/chronos/models.py:966
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:673
-#: aleksis/apps/chronos/models.py:745 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:77 aleksis/apps/chronos/models.py:683
+#: aleksis/apps/chronos/models.py:755 aleksis/apps/chronos/models.py:967
 msgid "End date"
 msgstr ""
 
@@ -119,300 +119,300 @@ msgstr ""
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:313 aleksis/apps/chronos/models.py:474
-#: aleksis/apps/chronos/models.py:1071
+#: aleksis/apps/chronos/models.py:323 aleksis/apps/chronos/models.py:484
+#: aleksis/apps/chronos/models.py:1081
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:314
+#: aleksis/apps/chronos/models.py:324
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:318 aleksis/apps/chronos/models.py:340
-#: aleksis/apps/chronos/models.py:616 aleksis/apps/chronos/models.py:789
-#: aleksis/apps/chronos/models.py:811
+#: aleksis/apps/chronos/models.py:328 aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:799
+#: aleksis/apps/chronos/models.py:821
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:319 aleksis/apps/chronos/models.py:341
-#: aleksis/apps/chronos/models.py:790 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:351
+#: aleksis/apps/chronos/models.py:800 aleksis/apps/chronos/models.py:822
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:321
+#: aleksis/apps/chronos/models.py:331
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:322
+#: aleksis/apps/chronos/models.py:332
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:414 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/models.py:339 aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:1088
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:330
+#: aleksis/apps/chronos/models.py:340
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:350
+#: aleksis/apps/chronos/models.py:360
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:419
-#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:669
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:362 aleksis/apps/chronos/models.py:429
+#: aleksis/apps/chronos/models.py:488 aleksis/apps/chronos/models.py:679
+#: aleksis/apps/chronos/models.py:1097
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
 msgid "Room"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:363 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/templates/chronos/all.html:39
 msgid "Rooms"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:366 aleksis/apps/chronos/models.py:417
-#: aleksis/apps/chronos/models.py:972 aleksis/apps/chronos/models.py:1084
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:427
+#: aleksis/apps/chronos/models.py:982 aleksis/apps/chronos/models.py:1094
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:369
+#: aleksis/apps/chronos/models.py:379
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:371 aleksis/apps/chronos/models.py:969
-#: aleksis/apps/chronos/models.py:1081 aleksis/apps/chronos/tables.py:34
+#: aleksis/apps/chronos/models.py:381 aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:1091 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:28
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:471
-#: aleksis/apps/chronos/models.py:710
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:481
+#: aleksis/apps/chronos/models.py:720
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:395
+#: aleksis/apps/chronos/models.py:405
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1068
+#: aleksis/apps/chronos/models.py:411 aleksis/apps/chronos/models.py:1078
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:402 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:412 aleksis/apps/chronos/models.py:1079
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:405 aleksis/apps/chronos/models.py:572
+#: aleksis/apps/chronos/models.py:415 aleksis/apps/chronos/models.py:582
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:421
+#: aleksis/apps/chronos/models.py:431
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423
+#: aleksis/apps/chronos/models.py:433
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:426 aleksis/apps/chronos/models.py:688
-#: aleksis/apps/chronos/models.py:730 aleksis/apps/chronos/models.py:1090
+#: aleksis/apps/chronos/models.py:436 aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:1100
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:430
+#: aleksis/apps/chronos/models.py:440
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:471
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:472
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:573
+#: aleksis/apps/chronos/models.py:583
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:611
+#: aleksis/apps/chronos/models.py:621
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:612
+#: aleksis/apps/chronos/models.py:622
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:626 aleksis/apps/chronos/models.py:644
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:654
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:627
+#: aleksis/apps/chronos/models.py:637
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:653 aleksis/apps/chronos/models.py:887
-#: aleksis/apps/chronos/models.py:933
+#: aleksis/apps/chronos/models.py:663 aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:943
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:45
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:661
+#: aleksis/apps/chronos/models.py:671
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:677 aleksis/apps/chronos/models.py:717
+#: aleksis/apps/chronos/models.py:687 aleksis/apps/chronos/models.py:727
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:684 aleksis/apps/chronos/models.py:724
+#: aleksis/apps/chronos/models.py:694 aleksis/apps/chronos/models.py:734
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:698
+#: aleksis/apps/chronos/models.py:708
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:704
+#: aleksis/apps/chronos/models.py:714
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:705
+#: aleksis/apps/chronos/models.py:715
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:723
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:729 aleksis/apps/chronos/models.py:743
-#: aleksis/apps/chronos/models.py:954
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:753
+#: aleksis/apps/chronos/models.py:964
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:736
+#: aleksis/apps/chronos/models.py:746
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:737
+#: aleksis/apps/chronos/models.py:747
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:756
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:784
+#: aleksis/apps/chronos/models.py:794
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:795
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:799 aleksis/apps/chronos/models.py:880
+#: aleksis/apps/chronos/models.py:809 aleksis/apps/chronos/models.py:890
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:800
+#: aleksis/apps/chronos/models.py:810
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:817
+#: aleksis/apps/chronos/models.py:827
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:825
+#: aleksis/apps/chronos/models.py:835
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:875 aleksis/apps/chronos/models.py:894
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:866
+#: aleksis/apps/chronos/models.py:876
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:918 aleksis/apps/chronos/models.py:927
+#: aleksis/apps/chronos/models.py:928 aleksis/apps/chronos/models.py:937
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:919
+#: aleksis/apps/chronos/models.py:929
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:925
+#: aleksis/apps/chronos/models.py:935
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:945
+#: aleksis/apps/chronos/models.py:955
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:946
+#: aleksis/apps/chronos/models.py:956
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:962
+#: aleksis/apps/chronos/models.py:972
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:976
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:979
+#: aleksis/apps/chronos/models.py:989
 #, python-brace-format
-msgid "Event {self.pk}"
+msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1057
+#: aleksis/apps/chronos/models.py:1067
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1058
+#: aleksis/apps/chronos/models.py:1068
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1109
+#: aleksis/apps/chronos/models.py:1119
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1110
+#: aleksis/apps/chronos/models.py:1120
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1118
+#: aleksis/apps/chronos/models.py:1128
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1119
+#: aleksis/apps/chronos/models.py:1129
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1120
+#: aleksis/apps/chronos/models.py:1130
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1121
+#: aleksis/apps/chronos/models.py:1131
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1122
+#: aleksis/apps/chronos/models.py:1132
 msgid "Can view all lessons per day"
 msgstr ""
 
@@ -477,7 +477,7 @@ msgid "Delete"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:49
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
 msgid "SMART PLAN"
 msgstr ""
 
@@ -534,20 +534,20 @@ msgid "Print: Substitutions"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:23
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
 #: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
 msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:28
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
 msgid "Group teachers:"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:54
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
 msgid "Show regular timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:66
+#: aleksis/apps/chronos/templates/chronos/timetable.html:67
 msgid "Show SMART PLAN"
 msgstr ""
 
@@ -559,14 +559,14 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:19
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
 msgid ""
 "\n"
-"              There is no timetable linked to your person.\n"
-"            "
+"          There is no timetable linked to your person.\n"
+"          "
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:29
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
 msgid "Go to smart plan"
 msgstr ""
 
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 07dc3fda0bd8429f7c335093bbe0b2ae3a07b723..aaeaf583b9d3a4644c1e9057c24697c2c0a8ba5f 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -161,14 +161,24 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
 
         return wanted_week[self.weekday]
 
-    def get_datetime_start(self, week: Optional[Union[CalendarWeek, int]] = None) -> datetime:
+    def get_datetime_start(
+        self, date_ref: Optional[Union[CalendarWeek, int, date]] = None
+    ) -> datetime:
         """Get datetime of lesson start in a specific week."""
-        day = self.get_date(week)
+        if isinstance(date_ref, date):
+            day = date_ref
+        else:
+            day = self.get_date(date_ref)
         return datetime.combine(day, self.time_start)
 
-    def get_datetime_end(self, week: Optional[Union[CalendarWeek, int]] = None) -> datetime:
+    def get_datetime_end(
+        self, date_ref: Optional[Union[CalendarWeek, int, date]] = None
+    ) -> datetime:
         """Get datetime of lesson end in a specific week."""
-        day = self.get_date(week)
+        if isinstance(date_ref, date):
+            day = date_ref
+        else:
+            day = self.get_date(date_ref)
         return datetime.combine(day, self.time_end)
 
     @classmethod
@@ -976,7 +986,7 @@ class Event(SchoolTermRelatedExtensibleModel, GroupPropertiesMixin, TeacherPrope
         if self.title:
             return self.title
         else:
-            return _(f"Event {self.pk}")
+            return _("Event {pk}").format(pk=self.pk)
 
     @property
     def raw_period_from_on_day(self) -> TimePeriod:
diff --git a/aleksis/apps/chronos/templatetags/week_helpers.py b/aleksis/apps/chronos/templatetags/week_helpers.py
index 2f66d51e449c2a0d46f53700b32b79e4b53fc3fa..cdba9b3f014913a2525b3ca59bfc514dc0e98ef1 100644
--- a/aleksis/apps/chronos/templatetags/week_helpers.py
+++ b/aleksis/apps/chronos/templatetags/week_helpers.py
@@ -36,13 +36,13 @@ def period_to_date(week: CalendarWeek, period) -> date:
 
 
 @register.simple_tag
-def period_to_time_start(week: CalendarWeek, period) -> date:
-    return period.get_datetime_start(week)
+def period_to_time_start(date_ref: Union[CalendarWeek, int, date], period) -> date:
+    return period.get_datetime_start(date_ref)
 
 
 @register.simple_tag
-def period_to_time_end(week: Union[CalendarWeek, int], period) -> date:
-    return period.get_datetime_end(week)
+def period_to_time_end(date_ref: Union[CalendarWeek, int, date], period) -> date:
+    return period.get_datetime_end(date_ref)
 
 
 @register.simple_tag
diff --git a/poetry.lock b/poetry.lock
index 548bf2f6e6979b4fff9a3f7acf1328ae90404413..cacb42208fb45c46a85378f2b0f845bfa19b827d 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -49,7 +49,7 @@ reference = "gitlab"
 
 [[package]]
 name = "aleksis-core"
-version = "2.1.dev0+20210801122831.5ac3ec6a"
+version = "2.1.dev0+20210924141832.35943230"
 description = "AlekSIS (School Information System) — Core"
 category = "main"
 optional = false
@@ -62,10 +62,10 @@ Celery = {version = ">=5.0.0,<6.0.0", extras = ["django", "redis"]}
 celery-haystack-ng = ">=0.20,<0.21"
 celery-progress = ">=0.1.0,<0.2.0"
 colour = ">=0.1.5,<0.2.0"
-Django = ">=3.2,<4.0"
+Django = ">=3.2.5,<4.0.0"
 django-allauth = ">=0.45.0,<0.46.0"
 django-any-js = ">=1.1,<2.0"
-django-bleach = ">=0.7.0,<0.8.0"
+django-bleach = ">=0.8.0,<0.9.0"
 django-cachalot = ">=2.3.2,<3.0.0"
 django-cache-memoize = ">=0.1.6,<0.2.0"
 django-celery-beat = ">=2.2.0,<3.0.0"
@@ -85,7 +85,7 @@ django-hattori = ">=0.2,<0.3"
 django-haystack = "3.0"
 django-health-check = ">=3.12.1,<4.0.0"
 django-impersonate = ">=1.4,<2.0"
-django-ipware = ">=3.0,<4.0"
+django-ipware = ">=4.0,<5.0"
 django-js-reverse = ">=0.9.1,<0.10.0"
 django-jsonstore = ">=0.5.0,<0.6.0"
 django-maintenance-mode = ">=0.16.0,<0.17.0"
@@ -234,14 +234,14 @@ stevedore = ">=1.20.0"
 
 [[package]]
 name = "beautifulsoup4"
-version = "4.9.3"
+version = "4.10.0"
 description = "Screen-scraping library"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">3.0.0"
 
 [package.dependencies]
-soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""}
+soupsieve = ">1.2"
 
 [package.extras]
 html5lib = ["html5lib"]
@@ -277,11 +277,11 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
 
 [[package]]
 name = "bleach"
-version = "3.3.1"
+version = "4.1.0"
 description = "An easy safelist-based HTML-sanitizing tool."
 category = "main"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.6"
 
 [package.dependencies]
 packaging = "*"
@@ -418,7 +418,7 @@ pycparser = "*"
 
 [[package]]
 name = "charset-normalizer"
-version = "2.0.4"
+version = "2.0.6"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
 category = "main"
 optional = false
@@ -516,7 +516,7 @@ toml = ["toml"]
 
 [[package]]
 name = "cryptography"
-version = "3.4.7"
+version = "3.4.8"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 category = "main"
 optional = false
@@ -553,7 +553,7 @@ dev = ["black (==19.10b0)", "flake8 (==3.8.4)", "mypy (==0.812)", "pytest (==6.2
 
 [[package]]
 name = "decorator"
-version = "5.0.9"
+version = "5.1.0"
 description = "Decorators for Humans"
 category = "main"
 optional = false
@@ -569,7 +569,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [[package]]
 name = "deprecated"
-version = "1.2.12"
+version = "1.2.13"
 description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
 category = "main"
 optional = false
@@ -591,7 +591,7 @@ python-versions = "*"
 
 [[package]]
 name = "django"
-version = "3.2.5"
+version = "3.2.7"
 description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
 category = "main"
 optional = false
@@ -634,18 +634,18 @@ Django = ">=2.2,<4.0"
 
 [[package]]
 name = "django-appconf"
-version = "1.0.4"
+version = "1.0.5"
 description = "A helper class for handling configuration defaults of packaged apps gracefully."
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [package.dependencies]
 django = "*"
 
 [[package]]
 name = "django-bleach"
-version = "0.7.2"
+version = "0.8.0"
 description = "Easily use bleach with Django models and templates"
 category = "main"
 optional = false
@@ -668,7 +668,7 @@ Django = ">=1.8"
 
 [[package]]
 name = "django-cachalot"
-version = "2.4.2"
+version = "2.4.3"
 description = "Caches your Django ORM queries and automatically invalidates them."
 category = "main"
 optional = false
@@ -747,7 +747,7 @@ python-versions = "*"
 
 [[package]]
 name = "django-colorfield"
-version = "0.4.2"
+version = "0.4.3"
 description = "simple color field for your models with a nice color-picker in the admin-interface."
 category = "main"
 optional = false
@@ -768,7 +768,7 @@ six = "*"
 
 [[package]]
 name = "django-debug-toolbar"
-version = "3.2.1"
+version = "3.2.2"
 description = "A configurable set of panels that display various debug information about the current request/response."
 category = "main"
 optional = false
@@ -804,7 +804,7 @@ Django = ">=2.2"
 
 [[package]]
 name = "django-favicon-plus-reloaded"
-version = "1.1.2"
+version = "1.1.3"
 description = "simple Django app which allows you to upload a image and it renders a wide variety for html link tags to display the favicon"
 category = "main"
 optional = false
@@ -894,7 +894,7 @@ python-versions = "*"
 
 [[package]]
 name = "django-ipware"
-version = "3.0.7"
+version = "4.0.0"
 description = "A Django application to retrieve user's IP address"
 category = "main"
 optional = false
@@ -933,7 +933,7 @@ six = "*"
 
 [[package]]
 name = "django-maintenance-mode"
-version = "0.16.0"
+version = "0.16.1"
 description = "django-maintenance-mode shows a 503 error page when maintenance-mode is on."
 category = "main"
 optional = false
@@ -986,7 +986,7 @@ six = "*"
 
 [[package]]
 name = "django-otp"
-version = "1.0.6"
+version = "1.1.1"
 description = "A pluggable framework for adding two-factor authentication to Django using one-time passwords."
 category = "main"
 optional = false
@@ -1095,7 +1095,7 @@ management_command = ["django-compressor (>=2.4)"]
 
 [[package]]
 name = "django-select2"
-version = "7.7.1"
+version = "7.7.2"
 description = "Select2 option fields for Django"
 category = "main"
 optional = false
@@ -1110,7 +1110,7 @@ test = ["pytest", "pytest-cov", "pytest-django", "selenium"]
 
 [[package]]
 name = "django-stubs"
-version = "1.8.0"
+version = "1.9.0"
 description = "Mypy stubs for Django"
 category = "dev"
 optional = false
@@ -1118,13 +1118,16 @@ python-versions = ">=3.6"
 
 [package.dependencies]
 django = "*"
-django-stubs-ext = "*"
-mypy = ">=0.790"
+django-stubs-ext = ">=0.3.0"
+mypy = ">=0.910"
+toml = "*"
+types-pytz = "*"
+types-PyYAML = "*"
 typing-extensions = "*"
 
 [[package]]
 name = "django-stubs-ext"
-version = "0.2.0"
+version = "0.3.1"
 description = "Monkey-patching and extensions for django-stubs"
 category = "dev"
 optional = false
@@ -1132,6 +1135,7 @@ python-versions = ">=3.6"
 
 [package.dependencies]
 django = "*"
+typing-extensions = "*"
 
 [[package]]
 name = "django-tables2"
@@ -1277,11 +1281,11 @@ pipenv = ["pipenv"]
 
 [[package]]
 name = "dynaconf"
-version = "3.1.4"
+version = "3.1.7"
 description = "The dynamic configurator for your Python Project"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.7"
 
 [package.dependencies]
 configobj = {version = "*", optional = true, markers = "extra == \"ini\""}
@@ -1299,7 +1303,7 @@ yaml = ["ruamel.yaml"]
 
 [[package]]
 name = "faker"
-version = "8.10.3"
+version = "8.14.0"
 description = "Faker is a Python package that generates fake data for you."
 category = "main"
 optional = false
@@ -1471,11 +1475,11 @@ smmap = ">=3.0.1,<5"
 
 [[package]]
 name = "gitpython"
-version = "3.1.20"
-description = "Python Git Library"
+version = "3.1.24"
+description = "GitPython is a python library used to interact with Git repositories"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 gitdb = ">=4.0.1,<5"
@@ -1528,7 +1532,7 @@ python-versions = "*"
 
 [[package]]
 name = "ipython"
-version = "7.25.0"
+version = "7.27.0"
 description = "IPython: Productive Interactive Computing"
 category = "main"
 optional = false
@@ -1558,14 +1562,6 @@ parallel = ["ipyparallel"]
 qtconsole = ["qtconsole"]
 test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
 
-[[package]]
-name = "ipython-genutils"
-version = "0.2.0"
-description = "Vestigial utilities from IPython"
-category = "main"
-optional = false
-python-versions = "*"
-
 [[package]]
 name = "isort"
 version = "5.9.3"
@@ -1611,7 +1607,7 @@ i18n = ["Babel (>=2.7)"]
 
 [[package]]
 name = "jwcrypto"
-version = "0.9.1"
+version = "1.0"
 description = "Implementation of JOSE Web standards"
 category = "main"
 optional = false
@@ -1620,7 +1616,6 @@ python-versions = "*"
 [package.dependencies]
 cryptography = ">=2.3"
 deprecated = "*"
-six = "*"
 
 [[package]]
 name = "kombu"
@@ -1682,7 +1677,7 @@ python-versions = ">=3.6"
 
 [[package]]
 name = "matplotlib-inline"
-version = "0.1.2"
+version = "0.1.3"
 description = "Inline Matplotlib backend for Jupyter"
 category = "main"
 optional = false
@@ -1805,18 +1800,18 @@ ptyprocess = ">=0.5"
 
 [[package]]
 name = "pg8000"
-version = "1.21.0"
+version = "1.21.2"
 description = "PostgreSQL interface library"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-scramp = ">=1.4.0"
+scramp = ">=1.4.1"
 
 [[package]]
 name = "phonenumbers"
-version = "8.12.28"
+version = "8.12.33"
 description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
 category = "main"
 optional = false
@@ -1832,7 +1827,7 @@ python-versions = "*"
 
 [[package]]
 name = "pillow"
-version = "8.3.1"
+version = "8.3.2"
 description = "Python Imaging Library (Fork)"
 category = "main"
 optional = false
@@ -1840,14 +1835,15 @@ python-versions = ">=3.6"
 
 [[package]]
 name = "pluggy"
-version = "0.13.1"
+version = "1.0.0"
 description = "plugin and hook calling mechanisms for python"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.6"
 
 [package.extras]
 dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
 
 [[package]]
 name = "prometheus-client"
@@ -1862,11 +1858,11 @@ twisted = ["twisted"]
 
 [[package]]
 name = "prompt-toolkit"
-version = "3.0.19"
+version = "3.0.20"
 description = "Library for building powerful interactive command lines in Python"
 category = "main"
 optional = false
-python-versions = ">=3.6.1"
+python-versions = ">=3.6.2"
 
 [package.dependencies]
 wcwidth = "*"
@@ -1954,7 +1950,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "pygments"
-version = "2.9.0"
+version = "2.10.0"
 description = "Pygments is a syntax highlighting package written in Python."
 category = "main"
 optional = false
@@ -1962,19 +1958,20 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "pyjwt"
-version = "1.7.1"
+version = "2.1.0"
 description = "JSON Web Token implementation in Python"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [package.dependencies]
-cryptography = {version = ">=1.4", optional = true, markers = "extra == \"crypto\""}
+cryptography = {version = ">=3.3.1,<4.0.0", optional = true, markers = "extra == \"crypto\""}
 
 [package.extras]
-crypto = ["cryptography (>=1.4)"]
-flake8 = ["flake8", "flake8-import-order", "pep8-naming"]
-test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"]
+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"]
+docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
+tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
 
 [[package]]
 name = "pyparsing"
@@ -1986,7 +1983,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "pytest"
-version = "6.2.4"
+version = "6.2.5"
 description = "pytest: simple powerful testing with Python"
 category = "dev"
 optional = false
@@ -1998,7 +1995,7 @@ attrs = ">=19.2.0"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
 iniconfig = "*"
 packaging = "*"
-pluggy = ">=0.12,<1.0.0a1"
+pluggy = ">=0.12,<2.0"
 py = ">=1.8.2"
 toml = "*"
 
@@ -2157,7 +2154,7 @@ hiredis = ["hiredis (>=0.1.3)"]
 
 [[package]]
 name = "regex"
-version = "2021.7.6"
+version = "2021.8.28"
 description = "Alternative regular expression module, to replace re."
 category = "dev"
 optional = false
@@ -2209,7 +2206,7 @@ docutils = ">=0.11,<1.0"
 
 [[package]]
 name = "ruamel.yaml"
-version = "0.17.10"
+version = "0.17.16"
 description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
 category = "main"
 optional = false
@@ -2254,14 +2251,14 @@ requests = "*"
 
 [[package]]
 name = "scramp"
-version = "1.4.0"
+version = "1.4.1"
 description = "An implementation of the SCRAM protocol."
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-asn1crypto = "1.4.0"
+asn1crypto = ">=1.4.0"
 
 [[package]]
 name = "selenium"
@@ -2449,7 +2446,7 @@ test = ["pytest"]
 
 [[package]]
 name = "sqlparse"
-version = "0.4.1"
+version = "0.4.2"
 description = "A non-validating SQL parser."
 category = "main"
 optional = false
@@ -2457,7 +2454,7 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "stevedore"
-version = "3.3.0"
+version = "3.4.0"
 description = "Manage dynamic plugins for Python applications"
 category = "dev"
 optional = false
@@ -2476,7 +2473,7 @@ python-versions = "*"
 
 [[package]]
 name = "testfixtures"
-version = "6.18.0"
+version = "6.18.2"
 description = "A collection of helpers and mock objects for unit tests and doc tests."
 category = "dev"
 optional = false
@@ -2531,7 +2528,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "tqdm"
-version = "4.62.0"
+version = "4.62.3"
 description = "Fast, Extensible Progress Meter"
 category = "main"
 optional = false
@@ -2547,31 +2544,27 @@ telegram = ["requests"]
 
 [[package]]
 name = "traitlets"
-version = "5.0.5"
+version = "5.1.0"
 description = "Traitlets Python configuration system"
 category = "main"
 optional = false
 python-versions = ">=3.7"
 
-[package.dependencies]
-ipython-genutils = "*"
-
 [package.extras]
 test = ["pytest"]
 
 [[package]]
 name = "twilio"
-version = "6.62.1"
+version = "7.0.0"
 description = "Twilio API client and TwiML generator"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6.0"
 
 [package.dependencies]
-PyJWT = "1.7.1"
+PyJWT = ">=2.0.0,<3.0.0"
 pytz = "*"
-requests = {version = ">=2.0.0", markers = "python_version >= \"3.0\""}
-six = "*"
+requests = ">=2.0.0"
 
 [[package]]
 name = "typed-ast"
@@ -2581,9 +2574,25 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "types-pytz"
+version = "2021.1.2"
+description = "Typing stubs for pytz"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "types-pyyaml"
+version = "5.4.10"
+description = "Typing stubs for PyYAML"
+category = "dev"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "typing-extensions"
-version = "3.10.0.0"
+version = "3.10.0.2"
 description = "Backported and Experimental Type Hints for Python 3.5+"
 category = "dev"
 optional = false
@@ -2591,7 +2600,7 @@ python-versions = "*"
 
 [[package]]
 name = "urllib3"
-version = "1.26.6"
+version = "1.26.7"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "main"
 optional = false
@@ -2665,10 +2674,11 @@ alabaster = [
 ]
 aleksis-builddeps = [
     {file = "AlekSIS-Builddeps-4.tar.gz", hash = "sha256:aaaa22965228b9b9b7de812e3e7fa9cbfdbf8635bb22d6f3a201dc0cc6d8d307"},
+    {file = "AlekSIS_Builddeps-4-py3-none-any.whl", hash = "sha256:02a93e503f5810e6c93a8bc829bc8cbda735ccbf78b91954d2f6507dfea3d01f"},
 ]
 aleksis-core = [
-    {file = "AlekSIS-Core-2.1.dev0+20210801122831.5ac3ec6a.tar.gz", hash = "sha256:ca0f58c438dd7dec178304c25ce57962c83aa2d43609204768a6f2925d012cc6"},
-    {file = "AlekSIS_Core-2.1.dev0+20210801122831.5ac3ec6a-py3-none-any.whl", hash = "sha256:f57b25db3faf795ce285973c2d09c8215dc62683049b63cb26cc82901c006e23"},
+    {file = "AlekSIS-Core-2.1.dev0+20210924141832.35943230.tar.gz", hash = "sha256:d8cd961a59874409633a4faf7151a5f4b41bbe4d697d0fb1bad0d5c9e3c10019"},
+    {file = "AlekSIS_Core-2.1.dev0+20210924141832.35943230-py3-none-any.whl", hash = "sha256:35ada661c701f1c21e15c4659c48899628d8cd4e21f11b603e2cb5008f99a3af"},
 ]
 amqp = [
     {file = "amqp-5.0.6-py3-none-any.whl", hash = "sha256:493a2ac6788ce270a2f6a765b017299f60c1998f5a8617908ee9be082f7300fb"},
@@ -2711,9 +2721,8 @@ bandit = [
     {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"},
 ]
 beautifulsoup4 = [
-    {file = "beautifulsoup4-4.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"},
-    {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"},
-    {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"},
+    {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"},
+    {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
 ]
 billiard = [
     {file = "billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b"},
@@ -2724,8 +2733,8 @@ black = [
     {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
 ]
 bleach = [
-    {file = "bleach-3.3.1-py2.py3-none-any.whl", hash = "sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78"},
-    {file = "bleach-3.3.1.tar.gz", hash = "sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa"},
+    {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
+    {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"},
 ]
 "boolean.py" = [
     {file = "boolean.py-3.8-py2.py3-none-any.whl", hash = "sha256:d75da0fd0354425fa64f6bbc6cec6ae1485d0eec3447b73187ff8cbf9b572e26"},
@@ -2802,8 +2811,8 @@ cffi = [
     {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
 ]
 charset-normalizer = [
-    {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"},
-    {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"},
+    {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"},
+    {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"},
 ]
 click = [
     {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
@@ -2886,42 +2895,47 @@ coverage = [
     {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
 ]
 cryptography = [
-    {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"},
-    {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"},
-    {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"},
-    {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"},
-    {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"},
-    {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"},
-    {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"},
-    {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"},
-    {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"},
-    {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"},
-    {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"},
-    {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"},
+    {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"},
 ]
 curlylint = [
     {file = "curlylint-0.12.2-py3-none-any.whl", hash = "sha256:98bc15609ce858387dd70a28c7ddda96e82d0f1cb8bf51b8902532ce0fc1a97e"},
     {file = "curlylint-0.12.2.tar.gz", hash = "sha256:76b557cf8d007bd92df2dae61a02e65f8aa2ff3e05c6398b1314d92692fbb0d8"},
 ]
 decorator = [
-    {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"},
-    {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"},
+    {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"},
+    {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"},
 ]
 defusedxml = [
     {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
     {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
 ]
 deprecated = [
-    {file = "Deprecated-1.2.12-py2.py3-none-any.whl", hash = "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771"},
-    {file = "Deprecated-1.2.12.tar.gz", hash = "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1"},
+    {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"},
+    {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"},
 ]
 dj-database-url = [
     {file = "dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163"},
     {file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"},
 ]
 django = [
-    {file = "Django-3.2.5-py3-none-any.whl", hash = "sha256:c58b5f19c5ae0afe6d75cbdd7df561e6eb929339985dbbda2565e1cabb19a62e"},
-    {file = "Django-3.2.5.tar.gz", hash = "sha256:3da05fea54fdec2315b54a563d5b59f3b4e2b1e69c3a5841dda35019c01855cd"},
+    {file = "Django-3.2.7-py3-none-any.whl", hash = "sha256:e93c93565005b37ddebf2396b4dc4b6913c1838baa82efdfb79acedd5816c240"},
+    {file = "Django-3.2.7.tar.gz", hash = "sha256:95b318319d6997bac3595517101ad9cc83fe5672ac498ba48d1a410f47afecd2"},
 ]
 django-allauth = [
     {file = "django-allauth-0.45.0.tar.gz", hash = "sha256:6d46be0e1480316ccd45476db3aefb39db70e038d2a543112d314b76bb999a4e"},
@@ -2931,20 +2945,20 @@ django-any-js = [
     {file = "django_any_js-1.1-py3-none-any.whl", hash = "sha256:1499934e293bbcaad29b8edaaefca87dda79eb3df1faeaaea67b80e2866ae1f8"},
 ]
 django-appconf = [
-    {file = "django-appconf-1.0.4.tar.gz", hash = "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380"},
-    {file = "django_appconf-1.0.4-py2.py3-none-any.whl", hash = "sha256:1b1d0e1069c843ebe8ae5aa48ec52403b1440402b320c3e3a206a0907e97bb06"},
+    {file = "django-appconf-1.0.5.tar.gz", hash = "sha256:be3db0be6c81fa84742000b89a81c016d70ae66a7ccb620cdef592b1f1a6aaa4"},
+    {file = "django_appconf-1.0.5-py3-none-any.whl", hash = "sha256:ae9f864ee1958c815a965ed63b3fba4874eec13de10236ba063a788f9a17389d"},
 ]
 django-bleach = [
-    {file = "django-bleach-0.7.2.tar.gz", hash = "sha256:2afc7ed5a10395b0bf84dfd43999305f77120902468071c18a7b666dcf5421bf"},
-    {file = "django_bleach-0.7.2-py2.py3-none-any.whl", hash = "sha256:8761714ff9737c81e595f0a362a0527fac31cf8208157f6d5f49c06863b21bad"},
+    {file = "django-bleach-0.8.0.tar.gz", hash = "sha256:42a83ad8a3306e081facb7ef405883035ea23a35204aea7c2502391f3911f821"},
+    {file = "django_bleach-0.8.0-py2.py3-none-any.whl", hash = "sha256:2c978b4a7516a9e166fa1d8eba950dcfadcd6b68c80971b527fd36f03050f4c2"},
 ]
 django-bulk-update = [
     {file = "django-bulk-update-2.2.0.tar.gz", hash = "sha256:5ab7ce8a65eac26d19143cc189c0f041d5c03b9d1b290ca240dc4f3d6aaeb337"},
     {file = "django_bulk_update-2.2.0-py2.py3-none-any.whl", hash = "sha256:49a403392ae05ea872494d74fb3dfa3515f8df5c07cc277c3dc94724c0ee6985"},
 ]
 django-cachalot = [
-    {file = "django-cachalot-2.4.2.tar.gz", hash = "sha256:67d3a783a8f61191cf8a1c1db944b08e276e93735434aafdee8d721bfd9e4901"},
-    {file = "django_cachalot-2.4.2-py3-none-any.whl", hash = "sha256:1d5c47e56425afc0b7131696d7894ed5c9d85cb6994282a02fe3d8bc274e1bd3"},
+    {file = "django-cachalot-2.4.3.tar.gz", hash = "sha256:2c81390f53d8c2e0ae6f266cff170b5681dad2416e09266ca7ca25f50e892a53"},
+    {file = "django_cachalot-2.4.3-py3-none-any.whl", hash = "sha256:d56ffa280da8317019959801703659616adcf60e1bf6513bd7e154b0b0851014"},
 ]
 django-cache-memoize = [
     {file = "django-cache-memoize-0.1.10.tar.gz", hash = "sha256:63e8faa245a41c0dbad843807e9f21a6e59eba8e6e50df310fdf6485a6749843"},
@@ -2971,15 +2985,15 @@ django-cleanup = [
     {file = "django_cleanup-5.2.0-py2.py3-none-any.whl", hash = "sha256:193cf69de54b9fc0a0f4547edbb3a63bbe01728cb029f9f4b7912098cc1bced7"},
 ]
 django-colorfield = [
-    {file = "django-colorfield-0.4.2.tar.gz", hash = "sha256:5624a23e2fe97066f45e56eedf9672ab545aa5e52a790cfc33a5f29160a70684"},
-    {file = "django_colorfield-0.4.2-py3-none-any.whl", hash = "sha256:7f907e11ed053b60d3316199446d76e889caeb27e980fe10cc2d8a825bc84e3a"},
+    {file = "django-colorfield-0.4.3.tar.gz", hash = "sha256:218932da7275ded152d0119131efde72e33b52abf88be4c14f8ffea799a112c4"},
+    {file = "django_colorfield-0.4.3-py3-none-any.whl", hash = "sha256:7f1b5ef2417928b7f25708ff31db2d119d255d27cbea496dae62bbde35325aec"},
 ]
 django-dbbackup = [
     {file = "django-dbbackup-3.3.0.tar.gz", hash = "sha256:bb109735cae98b64ad084e5b461b7aca2d7b39992f10c9ed9435e3ebb6fb76c8"},
 ]
 django-debug-toolbar = [
-    {file = "django-debug-toolbar-3.2.1.tar.gz", hash = "sha256:a5ff2a54f24bf88286f9872836081078f4baa843dc3735ee88524e89f8821e33"},
-    {file = "django_debug_toolbar-3.2.1-py3-none-any.whl", hash = "sha256:e759e63e3fe2d3110e0e519639c166816368701eab4a47fed75d7de7018467b9"},
+    {file = "django-debug-toolbar-3.2.2.tar.gz", hash = "sha256:8c5b13795d4040008ee69ba82dcdd259c49db346cf7d0de6e561a49d191f0860"},
+    {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"},
@@ -2990,8 +3004,8 @@ django-extensions = [
     {file = "django_extensions-3.1.3-py3-none-any.whl", hash = "sha256:50de8977794a66a91575dd40f87d5053608f679561731845edbd325ceeb387e3"},
 ]
 django-favicon-plus-reloaded = [
-    {file = "django-favicon-plus-reloaded-1.1.2.linux-x86_64.tar.gz", hash = "sha256:35d27ed9f559db3ff933b0020d747a94025b296e29b424c860a374fdfa3cef88"},
-    {file = "django_favicon_plus_reloaded-1.1.2-py3-none-any.whl", hash = "sha256:7c7b68180e59412df2b39fced669b286ba895262fb64116e2db61f20f5c8af29"},
+    {file = "django-favicon-plus-reloaded-1.1.3.tar.gz", hash = "sha256:36c2a1cefc201df8bd132492e2440ccdc3d9ceb8e421b2ca181a4704ebacd190"},
+    {file = "django_favicon_plus_reloaded-1.1.3-py3-none-any.whl", hash = "sha256:a60b438360e82bf7075b856ff6a80bae20c825373a58deac627810e478c42be3"},
 ]
 django-filter = [
     {file = "django-filter-2.4.0.tar.gz", hash = "sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06"},
@@ -3020,8 +3034,8 @@ django-impersonate = [
     {file = "django-impersonate-1.7.3.tar.gz", hash = "sha256:282003957577c7143fe31e5861f8fffdf6fe0c25557aedb28fcf8b11474eaa23"},
 ]
 django-ipware = [
-    {file = "django-ipware-3.0.7.tar.gz", hash = "sha256:753f8214a16ccaac54ea977349a96e37b582a28a54065e00c1c46d530862c85e"},
-    {file = "django_ipware-3.0.7-py2.py3-none-any.whl", hash = "sha256:a18820ea2b98ff3f87b7530eb6346f5feb65d18e89397606aacc098fa7b93db2"},
+    {file = "django-ipware-4.0.0.tar.gz", hash = "sha256:1294f916f3b3475e40e1b0ec1bd320aa2397978eae672721c81cbc2ed517e9ee"},
+    {file = "django_ipware-4.0.0-py2.py3-none-any.whl", hash = "sha256:116bd0d7940f09bf7ffd465943992e23d87e772a9d6c0d3a57b74040589a383b"},
 ]
 django-js-asset = [
     {file = "django-js-asset-1.2.2.tar.gz", hash = "sha256:c163ae80d2e0b22d8fb598047cd0dcef31f81830e127cfecae278ad574167260"},
@@ -3036,8 +3050,8 @@ django-jsonstore = [
     {file = "django_jsonstore-0.5.0-py2-none-any.whl", hash = "sha256:9630c1fb43ae9f8e32733c5cf7d4c3775ba6f08532f517c64025053352d72844"},
 ]
 django-maintenance-mode = [
-    {file = "django-maintenance-mode-0.16.0.tar.gz", hash = "sha256:57595795062156d5f3f712c885acc18b77a303425bf78b5de80e7fd47d9ab433"},
-    {file = "django_maintenance_mode-0.16.0-py3-none-any.whl", hash = "sha256:88287573b4e95285052f664d4f08e15ac4c350c1a6c77bc743ca3fc6e1f6410c"},
+    {file = "django-maintenance-mode-0.16.1.tar.gz", hash = "sha256:da1f77f431ab5c55913459adb3c259e091f783ffc72de701690826aaaccce4ca"},
+    {file = "django_maintenance_mode-0.16.1-py3-none-any.whl", hash = "sha256:1bfac0b34429a9f6dbb0db169fb753f49f24ca155ae148d7526ff395303c158d"},
 ]
 django-material = [
     {file = "django-material-1.9.0.tar.gz", hash = "sha256:5a7144d1029b4a2bfee2e5d0d8d00f30742dd7e3f868b3787d8cd61e54f26437"},
@@ -3055,8 +3069,8 @@ django-oauth-toolkit = [
     {file = "django_oauth_toolkit-1.5.0-py3-none-any.whl", hash = "sha256:b2e346a7c1e222774bfb370f21b556b92b408395b4c23914e2d1b241b2e5376a"},
 ]
 django-otp = [
-    {file = "django-otp-1.0.6.tar.gz", hash = "sha256:0d56dd2a7fbb6ee6e54557e036ca64add0bd3596f471794bad673b7637d5e935"},
-    {file = "django_otp-1.0.6-py3-none-any.whl", hash = "sha256:01b5888f0bde5125e139433aacb947e52d5c406fa56c9db43c3e8d75b5c323c4"},
+    {file = "django-otp-1.1.1.tar.gz", hash = "sha256:4c90cdaed683d736b0efafc034a3c6b410e1be2a53c24da287165b1f371d8776"},
+    {file = "django_otp-1.1.1-py3-none-any.whl", hash = "sha256:0c03a471db9e876f3671314bc9a65bd56a5c3c108ee0562c473701310bba4a77"},
 ]
 django-otp-yubikey = [
     {file = "django-otp-yubikey-1.0.0.post1.tar.gz", hash = "sha256:1da060257611d06e681848b7923fd788d878a79e8c358a373374deab13a085af"},
@@ -3091,16 +3105,16 @@ django-sass-processor = [
     {file = "django_sass_processor-1.0.1-py3-none-any.whl", hash = "sha256:1f043180c47754018e803a77da003377f5ea6558de57cd6946eb27a32e9c16a2"},
 ]
 django-select2 = [
-    {file = "django-select2-7.7.1.tar.gz", hash = "sha256:dd091342e99436818b3fa98783ae6c24fb2a0cbc37ebd3faa0aef68422b6e416"},
-    {file = "django_select2-7.7.1-py2.py3-none-any.whl", hash = "sha256:8c54984bb931d842eab6a46d1b427c6883e5f5347529cda27dcd942fb37d87b9"},
+    {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"},
 ]
 django-stubs = [
-    {file = "django-stubs-1.8.0.tar.gz", hash = "sha256:717967d7fee0a6af0746724a0be80d72831a982a40fa8f245a6a46f4cafd157b"},
-    {file = "django_stubs-1.8.0-py3-none-any.whl", hash = "sha256:bde9e44e3c4574c2454e74a3e607cc3bc23b0441bb7d1312cd677d5e30984b74"},
+    {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"},
+    {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"},
 ]
 django-stubs-ext = [
-    {file = "django-stubs-ext-0.2.0.tar.gz", hash = "sha256:c14f297835a42c1122421ec7e2d06579996b29d33b8016002762afa5d78863af"},
-    {file = "django_stubs_ext-0.2.0-py3-none-any.whl", hash = "sha256:bd4a1e36ef2ba0ef15801933c85c68e59b383302c873795c6ecfc25950c7ecdb"},
+    {file = "django-stubs-ext-0.3.1.tar.gz", hash = "sha256:783c198d7e39a41be0b90fd843fa2770243a642922af679be4b19e03b82c8c28"},
+    {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"},
@@ -3146,12 +3160,12 @@ dparse = [
     {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
 ]
 dynaconf = [
-    {file = "dynaconf-3.1.4-py2.py3-none-any.whl", hash = "sha256:e6f383b84150b70fc439c8b2757581a38a58d07962aa14517292dcce1a77e160"},
-    {file = "dynaconf-3.1.4.tar.gz", hash = "sha256:b2f472d83052f809c5925565b8a2ba76a103d5dc1dbb9748b693ed67212781b9"},
+    {file = "dynaconf-3.1.7-py2.py3-none-any.whl", hash = "sha256:f52fe5db7622da56a552275e8f64e4df46e3b4ae11158831b042e8ba2f6d1c96"},
+    {file = "dynaconf-3.1.7.tar.gz", hash = "sha256:e9d80b46ba4d9372f2f40c812594c963f74178140c0b596e57f2881001fc4d35"},
 ]
 faker = [
-    {file = "Faker-8.10.3-py3-none-any.whl", hash = "sha256:f27a2a5c34042752f9d5fea2a9667aed5265d7d7bdd5ce83bc03b2f8a540d148"},
-    {file = "Faker-8.10.3.tar.gz", hash = "sha256:771b21ab55924867ac865f4b0c2f547c200172293b1056be16289584ef1215cb"},
+    {file = "Faker-8.14.0-py3-none-any.whl", hash = "sha256:7b116034973a9a977a34a8a380354028150edf69f6cfbe55c03a852dd0a4116b"},
+    {file = "Faker-8.14.0.tar.gz", hash = "sha256:2649789e3e0c354dde1b8257d2ba7ed663fc3201e41277581de65c17e8aab10a"},
 ]
 flake8 = [
     {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"},
@@ -3205,8 +3219,8 @@ gitdb = [
     {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
 ]
 gitpython = [
-    {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"},
-    {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"},
+    {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"},
+    {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"},
 ]
 haystack-redis = [
     {file = "haystack-redis-0.0.1.tar.gz", hash = "sha256:ccfea88bdc1387c9f7f6f19e9bc062a3612039ef94cfd3e78cf59a96ddd269b2"},
@@ -3229,12 +3243,8 @@ iniconfig = [
     {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
 ]
 ipython = [
-    {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"},
-    {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"},
-]
-ipython-genutils = [
-    {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"},
-    {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"},
+    {file = "ipython-7.27.0-py3-none-any.whl", hash = "sha256:75b5e060a3417cf64f138e0bb78e58512742c57dc29db5a5058a2b1f0c10df02"},
+    {file = "ipython-7.27.0.tar.gz", hash = "sha256:58b55ebfdfa260dad10d509702dc2857cb25ad82609506b070cf2d7b7df5af13"},
 ]
 isort = [
     {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"},
@@ -3249,8 +3259,8 @@ jinja2 = [
     {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
 ]
 jwcrypto = [
-    {file = "jwcrypto-0.9.1-py2.py3-none-any.whl", hash = "sha256:12976a09895ec0076ce17c49ab7be64d6e63bcd7fd9a773e3fedf8011537a5f6"},
-    {file = "jwcrypto-0.9.1.tar.gz", hash = "sha256:63531529218ba9869e14ef8c9e7b516865ede3facf9b0ef3d3ba68014da211f9"},
+    {file = "jwcrypto-1.0-py2.py3-none-any.whl", hash = "sha256:db93a656d9a7a35dda5a68deb5c9f301f4e60507d8aef1559e0637b9ac497137"},
+    {file = "jwcrypto-1.0.tar.gz", hash = "sha256:f88816eb0a41b8f006af978ced5f171f33782525006cdb055b536a40f4d46ac9"},
 ]
 kombu = [
     {file = "kombu-5.1.0-py3-none-any.whl", hash = "sha256:e2dedd8a86c9077c350555153825a31e456a0dc20c15d5751f00137ec9c75f0a"},
@@ -3272,12 +3282,22 @@ license-expression = [
     {file = "license_expression-1.2-py2.py3-none-any.whl", hash = "sha256:6d97906380cecfc758a77f6d38c6760f2afade7e83d2b8295e234fe21f486fb8"},
 ]
 markupsafe = [
+    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
     {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
     {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
@@ -3286,14 +3306,21 @@ markupsafe = [
     {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
     {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
     {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
     {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
     {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
     {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
     {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
@@ -3303,13 +3330,16 @@ markupsafe = [
     {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
     {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
     {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
     {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
     {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
     {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
 ]
 matplotlib-inline = [
-    {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"},
-    {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"},
+    {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"},
+    {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"},
 ]
 mccabe = [
     {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
@@ -3376,69 +3406,83 @@ pexpect = [
     {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
 ]
 pg8000 = [
-    {file = "pg8000-1.21.0-py3-none-any.whl", hash = "sha256:02cb4ae1495ff2db4be89cefc72ae131d34af98264fdd6c29106731b33e10356"},
-    {file = "pg8000-1.21.0.tar.gz", hash = "sha256:c99108c630b1c468668a8def38be4c91b2fb7cf0154ce7918e7a3912e60652d7"},
+    {file = "pg8000-1.21.2-py3-none-any.whl", hash = "sha256:e5cffa2a561c5196a69118cdb6e94b6915bf6cc069790a902652a8f52799f586"},
+    {file = "pg8000-1.21.2.tar.gz", hash = "sha256:36a3b517408334967c1fa0d29656da03608d63122a372ec92c85f49aed2d24e3"},
 ]
 phonenumbers = [
-    {file = "phonenumbers-8.12.28-py2.py3-none-any.whl", hash = "sha256:f8ce05f82955d2faeefe2303350b2ccb7369dd39b6e45231a09475d67eb7e83b"},
-    {file = "phonenumbers-8.12.28.tar.gz", hash = "sha256:42ea4f946d5cce0056cbce257842ea6b281e69828ad2e7f27b29d3908e5b06bd"},
+    {file = "phonenumbers-8.12.33-py2.py3-none-any.whl", hash = "sha256:758d7f654b1eaec9a637510bf773b64833c6a417e7cf43ba9dccbcc2a16e44e1"},
+    {file = "phonenumbers-8.12.33.tar.gz", hash = "sha256:de3d5a3cb421c7421f584bb13cb9287e23ee2dd97d832fc35c9b55b96a576a3c"},
 ]
 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.1-1-cp36-cp36m-win_amd64.whl", hash = "sha256:fd7eef578f5b2200d066db1b50c4aa66410786201669fb76d5238b007918fb24"},
-    {file = "Pillow-8.3.1-1-cp37-cp37m-win_amd64.whl", hash = "sha256:75e09042a3b39e0ea61ce37e941221313d51a9c26b8e54e12b3ececccb71718a"},
-    {file = "Pillow-8.3.1-1-cp38-cp38-win_amd64.whl", hash = "sha256:c0e0550a404c69aab1e04ae89cca3e2a042b56ab043f7f729d984bf73ed2a093"},
-    {file = "Pillow-8.3.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:479ab11cbd69612acefa8286481f65c5dece2002ffaa4f9db62682379ca3bb77"},
-    {file = "Pillow-8.3.1-1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f156d6ecfc747ee111c167f8faf5f4953761b5e66e91a4e6767e548d0f80129c"},
-    {file = "Pillow-8.3.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd"},
-    {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723"},
-    {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04"},
-    {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37"},
-    {file = "Pillow-8.3.1-cp36-cp36m-win32.whl", hash = "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229"},
-    {file = "Pillow-8.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de"},
-    {file = "Pillow-8.3.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"},
-    {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab"},
-    {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf"},
-    {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0"},
-    {file = "Pillow-8.3.1-cp37-cp37m-win32.whl", hash = "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba"},
-    {file = "Pillow-8.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500"},
-    {file = "Pillow-8.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4"},
-    {file = "Pillow-8.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e"},
-    {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79"},
-    {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae"},
-    {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844"},
-    {file = "Pillow-8.3.1-cp38-cp38-win32.whl", hash = "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367"},
-    {file = "Pillow-8.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8"},
-    {file = "Pillow-8.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e"},
-    {file = "Pillow-8.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856"},
-    {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82"},
-    {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc"},
-    {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83"},
-    {file = "Pillow-8.3.1-cp39-cp39-win32.whl", hash = "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d"},
-    {file = "Pillow-8.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8"},
-    {file = "Pillow-8.3.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf"},
-    {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63"},
-    {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636"},
-    {file = "Pillow-8.3.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d"},
-    {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77"},
-    {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8"},
-    {file = "Pillow-8.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4"},
-    {file = "Pillow-8.3.1.tar.gz", hash = "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792"},
+    {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"},
 ]
 pluggy = [
-    {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
-    {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
+    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+    {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
 ]
 prometheus-client = [
     {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"},
     {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"},
 ]
 prompt-toolkit = [
-    {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"},
-    {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"},
+    {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"},
+    {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"},
 ]
 psutil = [
     {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"},
@@ -3538,20 +3582,20 @@ pyflakes = [
     {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"},
 ]
 pygments = [
-    {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"},
-    {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
+    {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
+    {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
 ]
 pyjwt = [
-    {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"},
-    {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"},
+    {file = "PyJWT-2.1.0-py3-none-any.whl", hash = "sha256:934d73fbba91b0483d3857d1aff50e96b2a892384ee2c17417ed3203f173fca1"},
+    {file = "PyJWT-2.1.0.tar.gz", hash = "sha256:fba44e7898bbca160a2b2b501f492824fc8382485d3a6f11ba5d0c1937ce6130"},
 ]
 pyparsing = [
     {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
     {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
 ]
 pytest = [
-    {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
-    {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
+    {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
+    {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
 ]
 pytest-cov = [
     {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
@@ -3627,47 +3671,47 @@ redis = [
     {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"},
 ]
 regex = [
-    {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"},
-    {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"},
-    {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"},
-    {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"},
-    {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"},
-    {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"},
-    {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"},
-    {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"},
-    {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"},
-    {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"},
-    {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"},
-    {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"},
-    {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"},
-    {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"},
-    {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"},
-    {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"},
-    {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"},
+    {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"},
+    {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"},
+    {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"},
+    {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"},
+    {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"},
+    {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"},
+    {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"},
+    {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"},
+    {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"},
+    {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"},
+    {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"},
+    {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"},
+    {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"},
+    {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"},
+    {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"},
+    {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"},
+    {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"},
+    {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"},
+    {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"},
+    {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"},
+    {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"},
+    {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"},
+    {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"},
+    {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"},
+    {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"},
+    {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"},
+    {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"},
+    {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"},
+    {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"},
+    {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"},
+    {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"},
+    {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"},
+    {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"},
+    {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"},
+    {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"},
+    {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"},
+    {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"},
+    {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"},
+    {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"},
+    {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"},
+    {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"},
 ]
 requests = [
     {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
@@ -3682,8 +3726,8 @@ restructuredtext-lint = [
     {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
 ]
 "ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"},
-    {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"},
+    {file = "ruamel.yaml-0.17.16-py3-none-any.whl", hash = "sha256:ea21da1198c4b41b8e7a259301cc9710d3b972bf8ba52f06218478e6802dd1f1"},
+    {file = "ruamel.yaml-0.17.16.tar.gz", hash = "sha256:1a771fc92d3823682b7f0893ad56cb5a5c87c48e62b5399d6f42c8759a583b33"},
 ]
 "ruamel.yaml.clib" = [
     {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"},
@@ -3716,8 +3760,8 @@ safety = [
     {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"},
 ]
 scramp = [
-    {file = "scramp-1.4.0-py3-none-any.whl", hash = "sha256:27349d6839038fe3b56c641ea2a8703df065c1d605fdee67275857c0a82122b4"},
-    {file = "scramp-1.4.0.tar.gz", hash = "sha256:d27d768408c6fc025a0e567eed84325b0aaf24364c81ea5974e8334ae3c4fda3"},
+    {file = "scramp-1.4.1-py3-none-any.whl", hash = "sha256:93c9cc2ffe54a451e02981c07a5a23cbd830701102789939cfb4ff91efd6ca8c"},
+    {file = "scramp-1.4.1.tar.gz", hash = "sha256:f964801077be9be2a1416ffe255d2d78834b3d9d5c8ce5d28f76a856f209f70e"},
 ]
 selenium = [
     {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"},
@@ -3783,19 +3827,19 @@ sphinxcontrib-serializinghtml = [
     {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 sqlparse = [
-    {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"},
-    {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"},
+    {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"},
+    {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
 ]
 stevedore = [
-    {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"},
-    {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"},
+    {file = "stevedore-3.4.0-py3-none-any.whl", hash = "sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e"},
+    {file = "stevedore-3.4.0.tar.gz", hash = "sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1"},
 ]
 termcolor = [
     {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
 ]
 testfixtures = [
-    {file = "testfixtures-6.18.0-py2.py3-none-any.whl", hash = "sha256:9bddf79b2dddb36420a20c25a65c827a8e7398c6ed4e2c75c2697857cb006be9"},
-    {file = "testfixtures-6.18.0.tar.gz", hash = "sha256:d4bd1c4f90eac90a73e1bdc59c31d03943f218d687f3c5a09e48478841a8af5f"},
+    {file = "testfixtures-6.18.2-py2.py3-none-any.whl", hash = "sha256:9c2316232de0ef6915d5446dcccaec9c4a6092751ba2ff7d30b9c14a954a90e3"},
+    {file = "testfixtures-6.18.2.tar.gz", hash = "sha256:61c25cb0213f68d2dcd2b098d9d2e7f47afc3b4429d66e1cdeb1072be2fcb241"},
 ]
 "testing.common.database" = [
     {file = "testing.common.database-2.0.3-py2.py3-none-any.whl", hash = "sha256:e3ed492bf480a87f271f74c53b262caf5d85c8bc09989a8f534fa2283ec52492"},
@@ -3814,15 +3858,15 @@ toml = [
     {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
 ]
 tqdm = [
-    {file = "tqdm-4.62.0-py2.py3-none-any.whl", hash = "sha256:706dea48ee05ba16e936ee91cb3791cd2ea6da348a0e50b46863ff4363ff4340"},
-    {file = "tqdm-4.62.0.tar.gz", hash = "sha256:3642d483b558eec80d3c831e23953582c34d7e4540db86d9e5ed9dad238dabc6"},
+    {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"},
+    {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"},
 ]
 traitlets = [
-    {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"},
-    {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"},
+    {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"},
+    {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"},
 ]
 twilio = [
-    {file = "twilio-6.62.1.tar.gz", hash = "sha256:18abcd69049b150a90d543b59d246ac6fd7a4db08c3fdbe600534de60f71345b"},
+    {file = "twilio-7.0.0.tar.gz", hash = "sha256:6cff34d61c3fad9d41e21b4b59527996fb7f0c6eeb5f001b90040b630fbf8446"},
 ]
 typed-ast = [
     {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
@@ -3856,14 +3900,22 @@ typed-ast = [
     {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
     {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"},
+]
+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"},
+]
 typing-extensions = [
-    {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
-    {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
-    {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
+    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
+    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
+    {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
 ]
 urllib3 = [
-    {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"},
-    {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"},
+    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
+    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
 ]
 vine = [
     {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"},
diff --git a/pyproject.toml b/pyproject.toml
index 4d305c3d69074975e5f609d55f74107d4c33080c..56b926d28947131b9b8017226473278795ca6fb0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Chronos"
-version = "2.0rc2"
+version = "2.0rc3"
 packages = [
     { include = "aleksis" }
 ]