From 9ee4be88507195df87d38e13a4a80b12cfde0c7a Mon Sep 17 00:00:00 2001
From: Tom Teichler <tom.teichler@teckids.org>
Date: Sun, 3 May 2020 19:31:34 +0200
Subject: [PATCH] [Reformat] black

---
 aleksis/apps/chronos/forms.py            |   4 +-
 aleksis/apps/chronos/managers.py         |  42 ++----
 aleksis/apps/chronos/model_extensions.py |   4 +-
 aleksis/apps/chronos/models.py           | 164 +++++------------------
 aleksis/apps/chronos/preferences.py      |   4 +-
 aleksis/apps/chronos/rules.py            |   4 +-
 aleksis/apps/chronos/tables.py           |   8 +-
 aleksis/apps/chronos/urls.py             |  13 +-
 aleksis/apps/chronos/util/build.py       |  52 ++-----
 aleksis/apps/chronos/views.py            |  37 ++---
 10 files changed, 79 insertions(+), 253 deletions(-)

diff --git a/aleksis/apps/chronos/forms.py b/aleksis/apps/chronos/forms.py
index 0e676e2f..ab31b103 100644
--- a/aleksis/apps/chronos/forms.py
+++ b/aleksis/apps/chronos/forms.py
@@ -24,6 +24,4 @@ class LessonSubstitutionForm(forms.ModelForm):
         }
 
 
-AnnouncementForm.add_node_to_layout(
-    Fieldset(_("Options for timetables"), "show_in_timetables")
-)
+AnnouncementForm.add_node_to_layout(Fieldset(_("Options for timetables"), "show_in_timetables"))
diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index 180640b5..d20e622e 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -116,10 +116,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
         """ Filter for all lessons within a calendar week. """
 
         return self.within_dates(
-            wanted_week[0]
-            + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
-            wanted_week[0]
-            + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
+            wanted_week[0] + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
+            wanted_week[0] + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
         ).annotate_week(wanted_week)
 
     def on_day(self, day: date):
@@ -154,9 +152,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
         return self.filter(
             Q(**{self._period_path + "lesson__groups__members": person})
-            | Q(
-                **{self._period_path + "lesson__groups__parent_groups__members": person}
-            )
+            | Q(**{self._period_path + "lesson__groups__parent_groups__members": person})
         )
 
     def filter_group(self, group: Union[Group, int]):
@@ -179,10 +175,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
         qs1 = self.filter(**{self._period_path + "lesson__teachers": teacher})
         qs2 = self.filter(
-            **{
-                self._subst_path + "teachers": teacher,
-                self._subst_path + "week": F("_week"),
-            }
+            **{self._subst_path + "teachers": teacher, self._subst_path + "week": F("_week"),}
         )
 
         return qs1.union(qs2)
@@ -197,9 +190,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
         return qs1.union(qs2)
 
-    def filter_from_type(
-        self, type_: TimetableType, pk: int
-    ) -> Optional[models.QuerySet]:
+    def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
         """Filter lesson data for a group, teacher or room by provided type."""
 
         if type_ == TimetableType.GROUP:
@@ -242,9 +233,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
         return lesson_periods
 
-    def next(
-        self, reference: "LessonPeriod", offset: Optional[int] = 1
-    ) -> "LessonPeriod":
+    def next(self, reference: "LessonPeriod", offset: Optional[int] = 1) -> "LessonPeriod":
         """ Get another lesson in an ordered set of lessons.
 
         By default, it returns the next lesson in the set. By passing the offset argument,
@@ -287,8 +276,7 @@ class LessonSubstitutionQuerySet(LessonDataQuerySet):
         """ Return all teachers which are affected by selected substitutions (as substituted or substituting) """
 
         return Person.objects.filter(
-            Q(lessons_as_teacher__in=self.affected_lessons())
-            | Q(lesson_substitutions__in=self)
+            Q(lessons_as_teacher__in=self.affected_lessons()) | Q(lesson_substitutions__in=self)
         ).annotate(lessons_count=Count("lessons_as_teacher"))
 
     def affected_groups(self):
@@ -334,19 +322,13 @@ class AbsenceQuerySet(DateRangeQuerySet):
     """QuerySet with custom query methods for absences."""
 
     def absent_teachers(self):
-        return Person.objects.filter(absences__in=self).annotate(
-            absences_count=Count("absences")
-        )
+        return Person.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
 
     def absent_groups(self):
-        return Group.objects.filter(absences__in=self).annotate(
-            absences_count=Count("absences")
-        )
+        return Group.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
 
     def absent_rooms(self):
-        return Person.objects.filter(absences__in=self).annotate(
-            absences_count=Count("absences")
-        )
+        return Person.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
 
 
 class HolidayQuerySet(DateRangeQuerySet):
@@ -426,9 +408,7 @@ class TimetableQuerySet(models.QuerySet):
         else:
             return self.filter(room=room)
 
-    def filter_from_type(
-        self, type_: TimetableType, pk: int
-    ) -> Optional[models.QuerySet]:
+    def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
         """Filter data for a group, teacher or room by provided type."""
 
         if type_ == TimetableType.GROUP:
diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py
index 2877278e..b0fec750 100644
--- a/aleksis/apps/chronos/model_extensions.py
+++ b/aleksis/apps/chronos/model_extensions.py
@@ -94,7 +94,5 @@ def for_timetables(cls):
 
 Announcement.class_method(for_timetables)
 Announcement.field(
-    show_in_timetables=BooleanField(
-        verbose_name=_("Show announcement in timetable views?")
-    )
+    show_in_timetables=BooleanField(verbose_name=_("Show announcement in timetable views?"))
 )
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index b82a5ec9..5ac95103 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -43,9 +43,7 @@ class TimePeriod(ExtensibleModel):
     WEEKDAY_CHOICES = list(enumerate(i18n_day_names_lazy()))
     WEEKDAY_CHOICES_SHORT = list(enumerate(i18n_day_abbrs_lazy()))
 
-    weekday = models.PositiveSmallIntegerField(
-        verbose_name=_("Week day"), choices=WEEKDAY_CHOICES
-    )
+    weekday = models.PositiveSmallIntegerField(verbose_name=_("Week day"), choices=WEEKDAY_CHOICES)
     period = models.PositiveSmallIntegerField(verbose_name=_("Number of period"))
 
     time_start = models.TimeField(verbose_name=_("Start time"))
@@ -120,15 +118,11 @@ class TimePeriod(ExtensibleModel):
 
     @classproperty
     def period_min(cls) -> int:
-        return cls.objects.aggregate(period__min=Coalesce(Min("period"), 1)).get(
-            "period__min"
-        )
+        return cls.objects.aggregate(period__min=Coalesce(Min("period"), 1)).get("period__min")
 
     @classproperty
     def period_max(cls) -> int:
-        return cls.objects.aggregate(period__max=Coalesce(Max("period"), 7)).get(
-            "period__max"
-        )
+        return cls.objects.aggregate(period__max=Coalesce(Max("period"), 7)).get("period__max")
 
     @classproperty
     def time_min(cls) -> Optional[time]:
@@ -140,15 +134,11 @@ class TimePeriod(ExtensibleModel):
 
     @classproperty
     def weekday_min(cls) -> int:
-        return cls.objects.aggregate(weekday__min=Coalesce(Min("weekday"), 0)).get(
-            "weekday__min"
-        )
+        return cls.objects.aggregate(weekday__min=Coalesce(Min("weekday"), 0)).get("weekday__min")
 
     @classproperty
     def weekday_max(cls) -> int:
-        return cls.objects.aggregate(weekday__max=Coalesce(Max("weekday"), 6)).get(
-            "weekday__max"
-        )
+        return cls.objects.aggregate(weekday__max=Coalesce(Max("weekday"), 6)).get("weekday__max")
 
     class Meta:
         unique_together = [["weekday", "period"]]
@@ -159,9 +149,7 @@ class TimePeriod(ExtensibleModel):
 
 
 class Subject(ExtensibleModel):
-    short_name = models.CharField(
-        verbose_name=_("Short name"), max_length=255, unique=True
-    )
+    short_name = models.CharField(verbose_name=_("Short name"), max_length=255, unique=True)
     name = models.CharField(verbose_name=_("Long name"), max_length=255, unique=True)
 
     colour_fg = ColorField(verbose_name=_("Foreground colour"), blank=True)
@@ -177,9 +165,7 @@ class Subject(ExtensibleModel):
 
 
 class Room(ExtensibleModel):
-    short_name = models.CharField(
-        verbose_name=_("Short name"), max_length=255, unique=True
-    )
+    short_name = models.CharField(verbose_name=_("Short name"), max_length=255, unique=True)
     name = models.CharField(verbose_name=_("Long name"), max_length=255)
 
     def __str__(self) -> str:
@@ -193,23 +179,15 @@ class Room(ExtensibleModel):
 
 class Lesson(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
     subject = models.ForeignKey(
-        "Subject",
-        on_delete=models.CASCADE,
-        related_name="lessons",
-        verbose_name=_("Subject"),
+        "Subject", on_delete=models.CASCADE, related_name="lessons", verbose_name=_("Subject"),
     )
     teachers = models.ManyToManyField(
         "core.Person", related_name="lessons_as_teacher", verbose_name=_("Teachers")
     )
     periods = models.ManyToManyField(
-        "TimePeriod",
-        related_name="lessons",
-        through="LessonPeriod",
-        verbose_name=_("Periods"),
-    )
-    groups = models.ManyToManyField(
-        "core.Group", related_name="lessons", verbose_name=_("Groups")
+        "TimePeriod", related_name="lessons", through="LessonPeriod", verbose_name=_("Periods"),
     )
+    groups = models.ManyToManyField("core.Group", related_name="lessons", verbose_name=_("Groups"))
 
     date_start = models.DateField(verbose_name=_("Start date"), null=True)
     date_end = models.DateField(verbose_name=_("End date"), null=True)
@@ -234,9 +212,7 @@ class Lesson(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
 class LessonSubstitution(ExtensibleModel):
     objects = LessonSubstitutionManager.from_queryset(LessonSubstitutionQuerySet)()
 
-    week = models.IntegerField(
-        verbose_name=_("Week"), default=CalendarWeek.current_week
-    )
+    week = models.IntegerField(verbose_name=_("Week"), default=CalendarWeek.current_week)
 
     lesson_period = models.ForeignKey(
         "LessonPeriod", models.CASCADE, "substitutions", verbose_name=_("Lesson period")
@@ -251,14 +227,9 @@ class LessonSubstitution(ExtensibleModel):
         verbose_name=_("Subject"),
     )
     teachers = models.ManyToManyField(
-        "core.Person",
-        related_name="lesson_substitutions",
-        blank=True,
-        verbose_name=_("Teachers"),
-    )
-    room = models.ForeignKey(
-        "Room", models.CASCADE, null=True, blank=True, verbose_name=_("Room")
+        "core.Person", related_name="lesson_substitutions", blank=True, verbose_name=_("Teachers"),
     )
+    room = models.ForeignKey("Room", models.CASCADE, null=True, blank=True, verbose_name=_("Room"))
 
     cancelled = models.BooleanField(default=False, verbose_name=_("Cancelled?"))
     cancelled_for_teachers = models.BooleanField(
@@ -269,9 +240,7 @@ class LessonSubstitution(ExtensibleModel):
 
     def clean(self) -> None:
         if self.subject and self.cancelled:
-            raise ValidationError(
-                _("Lessons can only be either substituted or cancelled.")
-            )
+            raise ValidationError(_("Lessons can only be either substituted or cancelled."))
 
     @property
     def date(self):
@@ -305,24 +274,14 @@ class LessonPeriod(ExtensibleModel):
     objects = LessonPeriodManager.from_queryset(LessonPeriodQuerySet)()
 
     lesson = models.ForeignKey(
-        "Lesson",
-        models.CASCADE,
-        related_name="lesson_periods",
-        verbose_name=_("Lesson"),
+        "Lesson", models.CASCADE, related_name="lesson_periods", verbose_name=_("Lesson"),
     )
     period = models.ForeignKey(
-        "TimePeriod",
-        models.CASCADE,
-        related_name="lesson_periods",
-        verbose_name=_("Time period"),
+        "TimePeriod", models.CASCADE, related_name="lesson_periods", verbose_name=_("Time period"),
     )
 
     room = models.ForeignKey(
-        "Room",
-        models.CASCADE,
-        null=True,
-        related_name="lesson_periods",
-        verbose_name=_("Room"),
+        "Room", models.CASCADE, null=True, related_name="lesson_periods", verbose_name=_("Room"),
     )
 
     def get_substitution(self, week: Optional[int] = None) -> LessonSubstitution:
@@ -383,9 +342,7 @@ class TimetableWidget(DashboardWidget):
 
         request = get_request()
         context = {"has_plan": True}
-        wanted_day = TimePeriod.get_next_relevant_day(
-            timezone.now().date(), datetime.now().time()
-        )
+        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
 
         if has_person(request.user):
             person = request.user.person
@@ -419,9 +376,7 @@ class TimetableWidget(DashboardWidget):
 
 class AbsenceReason(ExtensibleModel):
     short_name = models.CharField(verbose_name=_("Short name"), max_length=255)
-    name = models.CharField(
-        verbose_name=_("Name"), blank=True, null=True, max_length=255
-    )
+    name = models.CharField(verbose_name=_("Name"), blank=True, null=True, max_length=255)
 
     def __str__(self):
         if self.name:
@@ -508,10 +463,7 @@ class Absence(ExtensibleModel):
 
 class Exam(ExtensibleModel):
     lesson = models.ForeignKey(
-        "Lesson",
-        on_delete=models.CASCADE,
-        related_name="exams",
-        verbose_name=_("Lesson"),
+        "Lesson", on_delete=models.CASCADE, related_name="exams", verbose_name=_("Lesson"),
     )
 
     date = models.DateField(verbose_name=_("Date of exam"), null=True)
@@ -616,27 +568,15 @@ class Break(ExtensibleModel):
 
     @property
     def weekday(self):
-        return (
-            self.after_period.weekday
-            if self.after_period
-            else self.before_period.weekday
-        )
+        return self.after_period.weekday if self.after_period else self.before_period.weekday
 
     @property
     def after_period_number(self):
-        return (
-            self.after_period.period
-            if self.after_period
-            else self.before_period.period - 1
-        )
+        return self.after_period.period if self.after_period else self.before_period.period - 1
 
     @property
     def before_period_number(self):
-        return (
-            self.before_period.period
-            if self.before_period
-            else self.after_period.period + 1
-        )
+        return self.before_period.period if self.before_period else self.after_period.period + 1
 
     @property
     def time_start(self):
@@ -677,15 +617,10 @@ class Supervision(ExtensibleModel):
         Break, models.CASCADE, verbose_name=_("Break"), related_name="supervisions"
     )
     teacher = models.ForeignKey(
-        "core.Person",
-        models.CASCADE,
-        related_name="supervisions",
-        verbose_name=_("Teacher"),
+        "core.Person", models.CASCADE, related_name="supervisions", verbose_name=_("Teacher"),
     )
 
-    def get_substitution(
-        self, week: Optional[int] = None
-    ) -> Optional[SupervisionSubstitution]:
+    def get_substitution(self, week: Optional[int] = None) -> Optional[SupervisionSubstitution]:
         wanted_week = week or getattr(self, "_week", None) or CalendarWeek().week
         wanted_week = CalendarWeek(week=wanted_week)
         # We iterate over all substitutions because this can make use of
@@ -713,10 +648,7 @@ class Supervision(ExtensibleModel):
 class SupervisionSubstitution(ExtensibleModel):
     date = models.DateField(verbose_name=_("Date"))
     supervision = models.ForeignKey(
-        Supervision,
-        models.CASCADE,
-        verbose_name=_("Supervision"),
-        related_name="substitutions",
+        Supervision, models.CASCADE, verbose_name=_("Supervision"), related_name="substitutions",
     )
     teacher = models.ForeignKey(
         "core.Person",
@@ -743,9 +675,7 @@ class Event(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
 
     objects = models.Manager.from_queryset(EventQuerySet)()
 
-    title = models.CharField(
-        verbose_name=_("Title"), max_length=255, blank=True, null=True
-    )
+    title = models.CharField(verbose_name=_("Title"), max_length=255, blank=True, null=True)
 
     date_start = models.DateField(verbose_name=_("Start date"), null=True)
     date_end = models.DateField(verbose_name=_("End date"), null=True)
@@ -757,18 +687,11 @@ class Event(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
         related_name="+",
     )
     period_to = models.ForeignKey(
-        "TimePeriod",
-        on_delete=models.CASCADE,
-        verbose_name=_("End time period"),
-        related_name="+",
+        "TimePeriod", on_delete=models.CASCADE, verbose_name=_("End time period"), related_name="+",
     )
 
-    groups = models.ManyToManyField(
-        "core.Group", related_name="events", verbose_name=_("Groups")
-    )
-    rooms = models.ManyToManyField(
-        "Room", related_name="events", verbose_name=_("Rooms")
-    )
+    groups = models.ManyToManyField("core.Group", related_name="events", verbose_name=_("Groups"))
+    rooms = models.ManyToManyField("Room", related_name="events", verbose_name=_("Rooms"))
     teachers = models.ManyToManyField(
         "core.Person", related_name="events", verbose_name=_("Teachers")
     )
@@ -797,9 +720,7 @@ class Event(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
 
     class Meta:
         ordering = ["date_start"]
-        indexes = [
-            models.Index(fields=["period_from", "period_to", "date_start", "date_end"])
-        ]
+        indexes = [models.Index(fields=["period_from", "period_to", "date_start", "date_end"])]
         verbose_name = _("Event")
         verbose_name_plural = _("Events")
 
@@ -809,14 +730,9 @@ class ExtraLesson(ExtensibleModel, GroupPropertiesMixin):
 
     objects = models.Manager.from_queryset(ExtraLessonQuerySet)()
 
-    week = models.IntegerField(
-        verbose_name=_("Week"), default=CalendarWeek.current_week
-    )
+    week = models.IntegerField(verbose_name=_("Week"), default=CalendarWeek.current_week)
     period = models.ForeignKey(
-        "TimePeriod",
-        models.CASCADE,
-        related_name="extra_lessons",
-        verbose_name=_("Time period"),
+        "TimePeriod", models.CASCADE, related_name="extra_lessons", verbose_name=_("Time period"),
     )
 
     subject = models.ForeignKey(
@@ -829,21 +745,13 @@ class ExtraLesson(ExtensibleModel, GroupPropertiesMixin):
         "core.Group", related_name="extra_lessons", verbose_name=_("Groups")
     )
     teachers = models.ManyToManyField(
-        "core.Person",
-        related_name="extra_lessons_as_teacher",
-        verbose_name=_("Teachers"),
+        "core.Person", related_name="extra_lessons_as_teacher", verbose_name=_("Teachers"),
     )
     room = models.ForeignKey(
-        "Room",
-        models.CASCADE,
-        null=True,
-        related_name="extra_lessons",
-        verbose_name=_("Room"),
+        "Room", models.CASCADE, null=True, related_name="extra_lessons", verbose_name=_("Room"),
     )
 
-    comment = models.CharField(
-        verbose_name=_("Comment"), blank=True, null=True, max_length=255
-    )
+    comment = models.CharField(verbose_name=_("Comment"), blank=True, null=True, max_length=255)
 
     def __str__(self):
         return f"{self.week}, {self.period}, {self.subject}"
diff --git a/aleksis/apps/chronos/preferences.py b/aleksis/apps/chronos/preferences.py
index c0a4294d..f7e610c5 100644
--- a/aleksis/apps/chronos/preferences.py
+++ b/aleksis/apps/chronos/preferences.py
@@ -30,9 +30,7 @@ class ShortenGroups(BooleanPreference):
     name = "shorten_groups"
     default = True
     verbose_name = _("Shorten groups in timetable views")
-    help_text = _(
-        "If there are more groups than the set limit, they will be collapsed."
-    )
+    help_text = _("If there are more groups than the set limit, they will be collapsed.")
 
 
 @site_preferences_registry.register
diff --git a/aleksis/apps/chronos/rules.py b/aleksis/apps/chronos/rules.py
index dc0369b0..6a0edbc8 100644
--- a/aleksis/apps/chronos/rules.py
+++ b/aleksis/apps/chronos/rules.py
@@ -10,9 +10,7 @@ from .models import LessonSubstitution
 from .util.predicates import has_timetable_perm
 
 # View timetable overview
-view_timetable_overview_predicate = has_person & has_global_perm(
-    "chronos.view_timetable_overview"
-)
+view_timetable_overview_predicate = has_person & has_global_perm("chronos.view_timetable_overview")
 add_perm("chronos.view_timetable_overview", view_timetable_overview_predicate)
 
 # View my timetable
diff --git a/aleksis/apps/chronos/tables.py b/aleksis/apps/chronos/tables.py
index 92a966fe..bc4011f3 100644
--- a/aleksis/apps/chronos/tables.py
+++ b/aleksis/apps/chronos/tables.py
@@ -31,12 +31,8 @@ class LessonsTable(tables.Table):
         row_attrs = {"class": _css_class_from_lesson_state}
 
     period__period = tables.Column(accessor="period__period")
-    lesson__groups = tables.Column(
-        accessor="lesson__group_names", verbose_name=_("Groups")
-    )
-    lesson__teachers = tables.Column(
-        accessor="lesson__teacher_names", verbose_name=_("Teachers")
-    )
+    lesson__groups = tables.Column(accessor="lesson__group_names", verbose_name=_("Groups"))
+    lesson__teachers = tables.Column(accessor="lesson__teacher_names", verbose_name=_("Teachers"))
     lesson__subject = tables.Column(accessor="lesson__subject")
     room = tables.Column(accessor="room")
     edit_substitution = tables.LinkColumn(
diff --git a/aleksis/apps/chronos/urls.py b/aleksis/apps/chronos/urls.py
index 3d68c3a1..666183ec 100644
--- a/aleksis/apps/chronos/urls.py
+++ b/aleksis/apps/chronos/urls.py
@@ -17,15 +17,11 @@ urlpatterns = [
         name="timetable_by_week",
     ),
     path(
-        "timetable/<str:type_>/<int:pk>/<str:regular>/",
-        views.timetable,
-        name="timetable_regular",
+        "timetable/<str:type_>/<int:pk>/<str:regular>/", views.timetable, name="timetable_regular",
     ),
     path("lessons/", views.lessons_day, name="lessons_day"),
     path(
-        "lessons/<int:year>/<int:month>/<int:day>/",
-        views.lessons_day,
-        name="lessons_day_by_date",
+        "lessons/<int:year>/<int:month>/<int:day>/", views.lessons_day, name="lessons_day_by_date",
     ),
     path(
         "lessons/<int:id_>/<int:week>/substition/",
@@ -39,10 +35,7 @@ urlpatterns = [
     ),
     path("substitutions/", views.substitutions, name="substitutions"),
     path(
-        "substitutions/print/",
-        views.substitutions,
-        {"is_print": True},
-        name="substitutions_print",
+        "substitutions/print/", views.substitutions, {"is_print": True}, name="substitutions_print",
     ),
     path(
         "substitutions/<int:year>/<int:month>/<int:day>/",
diff --git a/aleksis/apps/chronos/util/build.py b/aleksis/apps/chronos/util/build.py
index e53eea2a..0083ec9c 100644
--- a/aleksis/apps/chronos/util/build.py
+++ b/aleksis/apps/chronos/util/build.py
@@ -21,9 +21,7 @@ ExtraLesson = apps.get_model("chronos", "ExtraLesson")
 
 
 def build_timetable(
-    type_: Union[TimetableType, str],
-    obj: Union[int, Person],
-    date_ref: Union[CalendarWeek, date],
+    type_: Union[TimetableType, str], obj: Union[int, Person], date_ref: Union[CalendarWeek, date],
 ):
     needed_breaks = []
 
@@ -50,9 +48,7 @@ def build_timetable(
     if is_person:
         lesson_periods = LessonPeriod.objects.daily_lessons_for_person(obj, date_ref)
     else:
-        lesson_periods = LessonPeriod.objects.in_week(date_ref).filter_from_type(
-            type_, obj
-        )
+        lesson_periods = LessonPeriod.objects.in_week(date_ref).filter_from_type(type_, obj)
 
     # Sort lesson periods in a dict
     lesson_periods_per_period = lesson_periods.group_by_periods(is_person=is_person)
@@ -61,9 +57,7 @@ def build_timetable(
     if is_person:
         extra_lessons = ExtraLesson.objects.on_day(date_ref).filter_from_person(obj)
     else:
-        extra_lessons = ExtraLesson.objects.filter(week=date_ref.week).filter_from_type(
-            type_, obj
-        )
+        extra_lessons = ExtraLesson.objects.filter(week=date_ref.week).filter_from_type(type_, obj)
 
     # Sort lesson periods in a dict
     extra_lessons_per_period = extra_lessons.group_by_periods(is_person=is_person)
@@ -130,9 +124,7 @@ def build_timetable(
             week = CalendarWeek.from_date(date_ref)
         else:
             week = date_ref
-        supervisions = (
-            Supervision.objects.all().annotate_week(week).filter_by_teacher(obj)
-        )
+        supervisions = Supervision.objects.all().annotate_week(week).filter_by_teacher(obj)
 
         if is_person:
             supervisions.filter_by_weekday(date_ref.weekday())
@@ -146,10 +138,7 @@ def build_timetable(
             if period_after_break not in needed_breaks:
                 needed_breaks.append(period_after_break)
 
-            if (
-                not is_person
-                and period_after_break not in supervisions_per_period_after
-            ):
+            if not is_person and period_after_break not in supervisions_per_period_after:
                 supervisions_per_period_after[period_after_break] = {}
 
             if is_person:
@@ -175,9 +164,7 @@ def build_timetable(
             if not is_person:
                 cols = []
 
-                for weekday in range(
-                    TimePeriod.weekday_min, TimePeriod.weekday_max + 1
-                ):
+                for weekday in range(TimePeriod.weekday_min, TimePeriod.weekday_max + 1):
                     col = None
                     if (
                         period in supervisions_per_period_after
@@ -206,32 +193,21 @@ def build_timetable(
 
             if not is_person:
                 cols = []
-                for weekday in range(
-                    TimePeriod.weekday_min, TimePeriod.weekday_max + 1
-                ):
+                for weekday in range(TimePeriod.weekday_min, TimePeriod.weekday_max + 1):
                     col = []
 
                     # Add lesson periods
-                    if (
-                        period in lesson_periods_per_period
-                        and weekday not in holidays_per_weekday
-                    ):
+                    if period in lesson_periods_per_period and weekday not in holidays_per_weekday:
                         if weekday in lesson_periods_per_period[period]:
                             col += lesson_periods_per_period[period][weekday]
 
                     # Add extra lessons
-                    if (
-                        period in extra_lessons_per_period
-                        and weekday not in holidays_per_weekday
-                    ):
+                    if period in extra_lessons_per_period and weekday not in holidays_per_weekday:
                         if weekday in extra_lessons_per_period[period]:
                             col += extra_lessons_per_period[period][weekday]
 
                     # Add events
-                    if (
-                        period in events_per_period
-                        and weekday not in holidays_per_weekday
-                    ):
+                    if period in events_per_period and weekday not in holidays_per_weekday:
                         if weekday in events_per_period[period]:
                             col += events_per_period[period][weekday]
 
@@ -328,9 +304,7 @@ def build_substitutions_list(wanted_day: date) -> List[dict]:
     return rows
 
 
-def build_weekdays(
-    base: List[Tuple[int, str]], wanted_week: CalendarWeek
-) -> List[dict]:
+def build_weekdays(base: List[Tuple[int, str]], wanted_week: CalendarWeek) -> List[dict]:
     holidays_per_weekday = Holiday.in_week(wanted_week)
 
     weekdays = []
@@ -340,9 +314,7 @@ def build_weekdays(
             "key": key,
             "name": name,
             "date": wanted_week[key],
-            "holiday": holidays_per_weekday[key]
-            if key in holidays_per_weekday
-            else None,
+            "holiday": holidays_per_weekday[key] if key in holidays_per_weekday else None,
         }
         weekdays.append(weekday)
 
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index 22f0eced..cad22382 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -29,19 +29,16 @@ def all_timetables(request: HttpRequest) -> HttpResponse:
     """View all timetables for persons, groups and rooms."""
     context = {}
 
-    teachers = Person.objects.annotate(
-        lessons_count=Count("lessons_as_teacher")
-    ).filter(lessons_count__gt=0)
+    teachers = Person.objects.annotate(lessons_count=Count("lessons_as_teacher")).filter(
+        lessons_count__gt=0
+    )
     groups = Group.objects.annotate(
-        lessons_count=Count("lessons"),
-        child_lessons_count=Count("child_groups__lessons"),
+        lessons_count=Count("lessons"), child_lessons_count=Count("child_groups__lessons"),
     )
     classes = groups.filter(lessons_count__gt=0, parent_groups=None) | groups.filter(
         child_lessons_count__gt=0, parent_groups=None
     )
-    rooms = Room.objects.annotate(lessons_count=Count("lesson_periods")).filter(
-        lessons_count__gt=0
-    )
+    rooms = Room.objects.annotate(lessons_count=Count("lesson_periods")).filter(lessons_count__gt=0)
 
     context["teachers"] = teachers
     context["classes"] = classes
@@ -64,9 +61,7 @@ def my_timetable(
         wanted_day = timezone.datetime(year=year, month=month, day=day).date()
         wanted_day = TimePeriod.get_next_relevant_day(wanted_day)
     else:
-        wanted_day = TimePeriod.get_next_relevant_day(
-            timezone.now().date(), datetime.now().time()
-        )
+        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
 
     if has_person(request.user):
         person = request.user.person
@@ -155,9 +150,7 @@ def timetable(
 
     # Build lists with weekdays and corresponding dates (long and short variant)
     context["weekdays"] = build_weekdays(TimePeriod.WEEKDAY_CHOICES, wanted_week)
-    context["weekdays_short"] = build_weekdays(
-        TimePeriod.WEEKDAY_CHOICES_SHORT, wanted_week
-    )
+    context["weekdays_short"] = build_weekdays(TimePeriod.WEEKDAY_CHOICES_SHORT, wanted_week)
 
     context["weeks"] = get_weeks_for_year(year=wanted_week.year)
     context["week"] = wanted_week
@@ -204,9 +197,7 @@ def lessons_day(
         wanted_day = timezone.datetime(year=year, month=month, day=day).date()
         wanted_day = TimePeriod.get_next_relevant_day(wanted_day)
     else:
-        wanted_day = TimePeriod.get_next_relevant_day(
-            timezone.now().date(), datetime.now().time()
-        )
+        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
 
     # Get lessons
     lesson_periods = LessonPeriod.objects.on_day(wanted_day)
@@ -269,9 +260,7 @@ def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse
             messages.success(request, _("The substitution has been saved."))
 
             date = wanted_week[lesson_period.period.weekday]
-            return redirect(
-                "lessons_day_by_date", year=date.year, month=date.month, day=date.day
-            )
+            return redirect("lessons_day_by_date", year=date.year, month=date.month, day=date.day)
 
     context["edit_substitution_form"] = edit_substitution_form
 
@@ -292,9 +281,7 @@ def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpRespon
     messages.success(request, _("The substitution has been deleted."))
 
     date = wanted_week[lesson_period.period.weekday]
-    return redirect(
-        "lessons_day_by_date", year=date.year, month=date.month, day=date.day
-    )
+    return redirect("lessons_day_by_date", year=date.year, month=date.month, day=date.day)
 
 
 @permission_required("chronos.view_substitutions")
@@ -312,9 +299,7 @@ def substitutions(
         wanted_day = timezone.datetime(year=year, month=month, day=day).date()
         wanted_day = TimePeriod.get_next_relevant_day(wanted_day)
     else:
-        wanted_day = TimePeriod.get_next_relevant_day(
-            timezone.now().date(), datetime.now().time()
-        )
+        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
 
     day_number = get_site_preferences()["chronos__substitutions_print_number_of_days"]
     day_contexts = {}
-- 
GitLab