diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f8bcd06c637e4de890c6a8b96312a05f102ca0f8..b2274c0f1da0fa3578ec8730511431f71bb085a9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,17 +1,17 @@
 include:
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/general.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/prepare/lock.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/test/test.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/test/lint.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/test/security.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/build/dist.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/publish/pypi.yml
-    - project: "AlekSIS/official/AlekSIS"
-      file: /ci/docker/image.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/general.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/prepare/lock.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/test/test.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/test/lint.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/test/security.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/build/dist.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/publish/pypi.yml
+  - project: "AlekSIS/official/AlekSIS"
+    file: /ci/docker/image.yml
diff --git a/aleksis/apps/alsijil/frontend/index.js b/aleksis/apps/alsijil/frontend/index.js
index be247a7bd650df9a3cc5cc491a0d00d0f86ac0fb..521c4b5629d6800abebaec1e4ce27f4f57cc3ab4 100644
--- a/aleksis/apps/alsijil/frontend/index.js
+++ b/aleksis/apps/alsijil/frontend/index.js
@@ -1,396 +1,396 @@
-import { notLoggedInValidator, hasPersonValidator } from "aleksis.core/routeValidators";
+import {
+  notLoggedInValidator,
+  hasPersonValidator,
+} from "aleksis.core/routeValidators";
 
-export default
-  {
-    meta: {
-      inMenu: true,
-      titleKey: "alsijil.menu_title",
-      icon: "mdi-account-group-outline",
-      validators: [
-        hasPersonValidator
-      ]
-    },
-    props: {
-      byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-    },
-    children: [
-      {
-        path: "lesson",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.lessonPeriod",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.lesson.menu_title",
-          icon: "mdi-alarm",
-          permission: "alsijil.view_lesson_menu_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "lesson/:year(\\d+)/:week(\\d+)/:id_(\\d+)",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.lessonPeriodByCWAndID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "extra_lesson/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.extraLessonByID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "event/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.eventByID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekView",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.week.menu_title",
-          icon: "mdi-view-week-outline",
-          permission: "alsijil.view_week_menu_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/:year(\\d+)/:week(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekViewByWeek",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/year/cw/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekViewPlaceholders",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/:type_/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekViewByTypeAndID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/year/cw/:type_/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekViewPlaceholdersByTypeAndID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "week/:year(\\d+)/:week(\\d+)/:type_/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.weekViewByWeekTypeAndID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "print/group/:id_(\\d+)",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.fullRegisterGroup",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "groups/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.myGroups",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.groups.menu_title",
-          icon: "mdi-account-multiple-outline",
-          permission: "alsijil.view_my_groups_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "groups/:pk(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.studentsList",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "persons/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.myStudents",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.persons.menu_title",
-          icon: "mdi-account-school-outline",
-          permission: "alsijil.view_my_students_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "persons/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.overviewPerson",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "me/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.overviewMe",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.my_overview.menu_title",
-          icon: "mdi-chart-box-outline",
-          permission: "alsijil.view_person_overview_menu_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "notes/:pk(\\d+)/delete/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.deletePersonalNote",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "absence/new/:id_(\\d+)/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.registerAbsenceWithID",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "absence/new/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.registerAbsence",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.absence.menu_title",
-          icon: "mdi-message-alert-outline",
-          permission: "alsijil.view_register_absence_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "extra_marks/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.extraMarks",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.extra_marks.menu_title",
-          icon: "mdi-label-variant-outline",
-          permission: "alsijil.view_extramarks_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "extra_marks/create/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.createExtraMark",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "extra_marks/:pk(\\d+)/edit/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.editExtraMark",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "extra_marks/:pk(\\d+)/delete/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.deleteExtraMark",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "excuse_types/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.excuseTypes",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.excuse_types.menu_title",
-          icon: "mdi-label-outline",
-          permission: "alsijil.view_excusetypes_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "excuse_types/create/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.createExcuseType",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "excuse_types/:pk(\\d+)/edit/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.editExcuseType",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "excuse_types/:pk(\\d+)/delete/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.deleteExcuseType",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.groupRoles",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.group_roles.menu_title_manage",
-          icon: "mdi-clipboard-plus-outline",
-          permission: "alsijil.view_grouproles_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/create/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.createGroupRole",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/:pk(\\d+)/edit/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.editGroupRole",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/:pk(\\d+)/delete/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.deleteGroupRole",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "groups/:pk(\\d+)/group_roles/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.assignedGroupRoles",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "groups/:pk(\\d+)/group_roles/assign/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.assignGroupRole",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "groups/:pk(\\d+)/group_roles/:role_pk(\\d+)/assign/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.assignGroupRoleByRolePK",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/assignments/:pk(\\d+)/edit/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.editGroupRoleAssignment",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/assignments/:pk(\\d+)/stop/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.stopGroupRoleAssignment",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/assignments/:pk(\\d+)/delete/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.deleteGroupRoleAssignment",
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "group_roles/assignments/assign/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.assignGroupRoleMultiple",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.group_roles.menu_title_assign",
-          icon: "mdi-clipboard-account-outline",
-          permission: "alsijil.assign_grouprole_for_multiple_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      {
-        path: "all/",
-        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-        name: "alsijil.allRegisterObjects",
-        meta: {
-          inMenu: true,
-          titleKey: "alsijil.all_lessons.menu_title",
-          icon: "mdi-format-list-text",
-          permission: "alsijil.view_register_objects_list_rule",
-        },
-        props: {
-          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-        },
-      },
-      ],
-  }
+export default {
+  meta: {
+    inMenu: true,
+    titleKey: "alsijil.menu_title",
+    icon: "mdi-account-group-outline",
+    validators: [hasPersonValidator],
+  },
+  props: {
+    byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+  },
+  children: [
+    {
+      path: "lesson",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.lessonPeriod",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.lesson.menu_title",
+        icon: "mdi-alarm",
+        permission: "alsijil.view_lesson_menu_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "lesson/:year(\\d+)/:week(\\d+)/:id_(\\d+)",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.lessonPeriodByCWAndID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "extra_lesson/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.extraLessonByID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "event/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.eventByID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekView",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.week.menu_title",
+        icon: "mdi-view-week-outline",
+        permission: "alsijil.view_week_menu_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/:year(\\d+)/:week(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekViewByWeek",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/year/cw/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekViewPlaceholders",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/:type_/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekViewByTypeAndID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/year/cw/:type_/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekViewPlaceholdersByTypeAndID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "week/:year(\\d+)/:week(\\d+)/:type_/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.weekViewByWeekTypeAndID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "print/group/:id_(\\d+)",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.fullRegisterGroup",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "groups/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.myGroups",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.groups.menu_title",
+        icon: "mdi-account-multiple-outline",
+        permission: "alsijil.view_my_groups_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "groups/:pk(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.studentsList",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "persons/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.myStudents",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.persons.menu_title",
+        icon: "mdi-account-school-outline",
+        permission: "alsijil.view_my_students_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "persons/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.overviewPerson",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "me/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.overviewMe",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.my_overview.menu_title",
+        icon: "mdi-chart-box-outline",
+        permission: "alsijil.view_person_overview_menu_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "notes/:pk(\\d+)/delete/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.deletePersonalNote",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "absence/new/:id_(\\d+)/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.registerAbsenceWithID",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "absence/new/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.registerAbsence",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.absence.menu_title",
+        icon: "mdi-message-alert-outline",
+        permission: "alsijil.view_register_absence_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "extra_marks/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.extraMarks",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.extra_marks.menu_title",
+        icon: "mdi-label-variant-outline",
+        permission: "alsijil.view_extramarks_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "extra_marks/create/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.createExtraMark",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "extra_marks/:pk(\\d+)/edit/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.editExtraMark",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "extra_marks/:pk(\\d+)/delete/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.deleteExtraMark",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "excuse_types/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.excuseTypes",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.excuse_types.menu_title",
+        icon: "mdi-label-outline",
+        permission: "alsijil.view_excusetypes_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "excuse_types/create/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.createExcuseType",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "excuse_types/:pk(\\d+)/edit/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.editExcuseType",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "excuse_types/:pk(\\d+)/delete/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.deleteExcuseType",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.groupRoles",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.group_roles.menu_title_manage",
+        icon: "mdi-clipboard-plus-outline",
+        permission: "alsijil.view_grouproles_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/create/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.createGroupRole",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/:pk(\\d+)/edit/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.editGroupRole",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/:pk(\\d+)/delete/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.deleteGroupRole",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "groups/:pk(\\d+)/group_roles/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.assignedGroupRoles",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "groups/:pk(\\d+)/group_roles/assign/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.assignGroupRole",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "groups/:pk(\\d+)/group_roles/:role_pk(\\d+)/assign/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.assignGroupRoleByRolePK",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/assignments/:pk(\\d+)/edit/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.editGroupRoleAssignment",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/assignments/:pk(\\d+)/stop/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.stopGroupRoleAssignment",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/assignments/:pk(\\d+)/delete/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.deleteGroupRoleAssignment",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "group_roles/assignments/assign/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.assignGroupRoleMultiple",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.group_roles.menu_title_assign",
+        icon: "mdi-clipboard-account-outline",
+        permission: "alsijil.assign_grouprole_for_multiple_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "all/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "alsijil.allRegisterObjects",
+      meta: {
+        inMenu: true,
+        titleKey: "alsijil.all_lessons.menu_title",
+        icon: "mdi-format-list-text",
+        permission: "alsijil.view_register_objects_list_rule",
+      },
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+  ],
+};
diff --git a/aleksis/apps/alsijil/frontend/messages/de.json b/aleksis/apps/alsijil/frontend/messages/de.json
index 0f754c7664cfffcea1dc1d8008d03a1fd7941d65..09456c74481a13e390b1e08e2389d027d8c6974d 100644
--- a/aleksis/apps/alsijil/frontend/messages/de.json
+++ b/aleksis/apps/alsijil/frontend/messages/de.json
@@ -1,36 +1,36 @@
 {
-    "alsijil": {
-        "menu_title": "Klassenbuch",
-        "lesson": {
-            "menu_title": "Aktuelle Unterrichtsstunde"
-        },
-        "week": {
-            "menu_title": "Aktuelle Woche"
-        },
-        "groups": {
-            "menu_title": "Meine Gruppen"
-        },
-        "persons": {
-            "menu_title": "Meine Schülerinnen und Schüler"
-        },
-        "absence": {
-            "menu_title": "Abwesenheit eintragen"
-        },
-        "my_overview": {
-            "menu_title": "Meine Übersicht"
-        },
-        "excuse_types": {
-            "menu_title": "Entschuldigungsarten"
-        },
-        "group_roles": {
-            "menu_title_assign": "Gruppenrollen zuweisen",
-            "menu_title_manage": "Gruppenrollen verwalten"
-        },
-        "extra_marks": {
-            "menu_title": "Zusätzliche Markierungen"
-        },
-        "all_lessons": {
-            "menu_title": "Alle Stunden"
-        }
+  "alsijil": {
+    "menu_title": "Klassenbuch",
+    "lesson": {
+      "menu_title": "Aktuelle Unterrichtsstunde"
+    },
+    "week": {
+      "menu_title": "Aktuelle Woche"
+    },
+    "groups": {
+      "menu_title": "Meine Gruppen"
+    },
+    "persons": {
+      "menu_title": "Meine Schülerinnen und Schüler"
+    },
+    "absence": {
+      "menu_title": "Abwesenheit eintragen"
+    },
+    "my_overview": {
+      "menu_title": "Meine Übersicht"
+    },
+    "excuse_types": {
+      "menu_title": "Entschuldigungsarten"
+    },
+    "group_roles": {
+      "menu_title_assign": "Gruppenrollen zuweisen",
+      "menu_title_manage": "Gruppenrollen verwalten"
+    },
+    "extra_marks": {
+      "menu_title": "Zusätzliche Markierungen"
+    },
+    "all_lessons": {
+      "menu_title": "Alle Stunden"
     }
+  }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/ru.json b/aleksis/apps/alsijil/frontend/messages/ru.json
index 26036c9ce82cfc8e9a3bc04b71c5ffdc1a2d6543..8fb7aea426577ea2406c1579dbe44b39b70e5ef6 100644
--- a/aleksis/apps/alsijil/frontend/messages/ru.json
+++ b/aleksis/apps/alsijil/frontend/messages/ru.json
@@ -1,36 +1,36 @@
 {
-    "alsijil": {
-        "my_overview": {
-            "menu_title": "Мой обзор"
-        },
-        "group_roles": {
-            "menu_title_manage": "Управление ролями групп",
-            "menu_title_assign": "Назначить роль группы"
-        },
-        "all_lessons": {
-            "menu_title": "Все уроки"
-        },
-        "menu_title": "Классный журнал",
-        "lesson": {
-            "menu_title": "Текущий урок"
-        },
-        "week": {
-            "menu_title": "Текущая неделя"
-        },
-        "groups": {
-            "menu_title": "Мои группы"
-        },
-        "persons": {
-            "menu_title": "Мои студенты"
-        },
-        "absence": {
-            "menu_title": "Регистрация отсутствия"
-        },
-        "extra_marks": {
-            "menu_title": "Дополнительные отметки"
-        },
-        "excuse_types": {
-            "menu_title": "Типы объяснительных"
-        }
+  "alsijil": {
+    "my_overview": {
+      "menu_title": "Мой обзор"
+    },
+    "group_roles": {
+      "menu_title_manage": "Управление ролями групп",
+      "menu_title_assign": "Назначить роль группы"
+    },
+    "all_lessons": {
+      "menu_title": "Все уроки"
+    },
+    "menu_title": "Классный журнал",
+    "lesson": {
+      "menu_title": "Текущий урок"
+    },
+    "week": {
+      "menu_title": "Текущая неделя"
+    },
+    "groups": {
+      "menu_title": "Мои группы"
+    },
+    "persons": {
+      "menu_title": "Мои студенты"
+    },
+    "absence": {
+      "menu_title": "Регистрация отсутствия"
+    },
+    "extra_marks": {
+      "menu_title": "Дополнительные отметки"
+    },
+    "excuse_types": {
+      "menu_title": "Типы объяснительных"
     }
+  }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/uk.json b/aleksis/apps/alsijil/frontend/messages/uk.json
index 8aa5da05e28341d587cb89f8a83e9568fc1e0dfa..a29573bea059ddf91b6ae156be5d76914dd2ca50 100644
--- a/aleksis/apps/alsijil/frontend/messages/uk.json
+++ b/aleksis/apps/alsijil/frontend/messages/uk.json
@@ -1,36 +1,36 @@
 {
-    "alsijil": {
-        "week": {
-            "menu_title": "Поточний тиждень"
-        },
-        "groups": {
-            "menu_title": "Мої групи"
-        },
-        "persons": {
-            "menu_title": "Мої студенти"
-        },
-        "absence": {
-            "menu_title": "Реєстрація відсутності"
-        },
-        "my_overview": {
-            "menu_title": "Мій огляд"
-        },
-        "extra_marks": {
-            "menu_title": "Додаткові відмітки"
-        },
-        "excuse_types": {
-            "menu_title": "Типи пояснень"
-        },
-        "group_roles": {
-            "menu_title_manage": "Керування ролями групи",
-            "menu_title_assign": "Призначити роль групи"
-        },
-        "all_lessons": {
-            "menu_title": "Усі уроки"
-        },
-        "menu_title": "Класний журнал",
-        "lesson": {
-            "menu_title": "Поточний урок"
-        }
+  "alsijil": {
+    "week": {
+      "menu_title": "Поточний тиждень"
+    },
+    "groups": {
+      "menu_title": "Мої групи"
+    },
+    "persons": {
+      "menu_title": "Мої студенти"
+    },
+    "absence": {
+      "menu_title": "Реєстрація відсутності"
+    },
+    "my_overview": {
+      "menu_title": "Мій огляд"
+    },
+    "extra_marks": {
+      "menu_title": "Додаткові відмітки"
+    },
+    "excuse_types": {
+      "menu_title": "Типи пояснень"
+    },
+    "group_roles": {
+      "menu_title_manage": "Керування ролями групи",
+      "menu_title_assign": "Призначити роль групи"
+    },
+    "all_lessons": {
+      "menu_title": "Усі уроки"
+    },
+    "menu_title": "Класний журнал",
+    "lesson": {
+      "menu_title": "Поточний урок"
     }
+  }
 }
diff --git a/aleksis/apps/alsijil/static/css/alsijil/alsijil.css b/aleksis/apps/alsijil/static/css/alsijil/alsijil.css
index 3e14ca014661f0f80d1df639d02949db6ffb59e9..a30fb99bb8b239ca38f7f4d627329594387741c6 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/alsijil.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/alsijil.css
@@ -9,52 +9,52 @@ table a.tr-link {
 }
 
 .collapsible-icon-right {
-	align-self: end;
-	flex-grow: 100;
-	text-align: right!important;
+  align-self: end;
+  flex-grow: 100;
+  text-align: right !important;
 }
 
 @media only screen and (min-width: 1201px) {
-    .hide-on-extra-large-only {
-        display: none;
-    }
+  .hide-on-extra-large-only {
+    display: none;
+  }
 }
 
 @media only screen and (max-width: 1200px) {
-    .show-on-extra-large {
-        display: none;
-    }
+  .show-on-extra-large {
+    display: none;
+  }
 }
 
 @media only screen and (max-width: 600px) {
-    .collection .collection-item.avatar {
-        padding-left: 20px;
-    }
-    .collection .collection-item.avatar:not(.circle-clipper) > .circle {
-        position: relative;
-        margin-bottom: 10px;
-    }
+  .collection .collection-item.avatar {
+    padding-left: 20px;
+  }
+  .collection .collection-item.avatar:not(.circle-clipper) > .circle {
+    position: relative;
+    margin-bottom: 10px;
+  }
 }
 
 .collapsible li .show-on-active {
-    display: none;
+  display: none;
 }
 
 .collapsible li.active .show-on-active {
-    display: block;
+  display: block;
 }
 
 th.chip-height {
-    height: 67px;
-    line-height: 2.2;
+  height: 67px;
+  line-height: 2.2;
 }
 
 .collection-item.chip-height {
-    height: 52px;
-    line-height: 2.2;
+  height: 52px;
+  line-height: 2.2;
 }
 
 li.collection-item.button-height {
-    height: 58px;
-    line-height: 2.5;
+  height: 58px;
+  line-height: 2.5;
 }
diff --git a/aleksis/apps/alsijil/static/css/alsijil/full_register.css b/aleksis/apps/alsijil/static/css/alsijil/full_register.css
index 9068a104cb2464a0cb95073e3ee8a66bddfaf21e..533c84326887b2050cb66edadcf92706f64b963d 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/full_register.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/full_register.css
@@ -1,72 +1,76 @@
-table.small-print, td.small-print, th.small-print {
-    font-size: 10pt;
+table.small-print,
+td.small-print,
+th.small-print {
+  font-size: 10pt;
 }
 
 #signatures {
-    padding-top: 3em;
+  padding-top: 3em;
 }
 
 #signatures .signature {
-    display: inline-block;
-    width: 12em;
-    border-top: 1px solid;
-    margin-right: 20px;
+  display: inline-block;
+  width: 12em;
+  border-top: 1px solid;
+  margin-right: 20px;
 }
 
 tr {
-    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.3);
 }
 
-td, th {
-    padding: 1px;
+td,
+th {
+  padding: 1px;
 }
 
 tr.lessons-day-first {
-    border-top: 3px solid rgba(0, 0, 0, 0.3);
+  border-top: 3px solid rgba(0, 0, 0, 0.3);
 }
 
-td.rotate, th.rotate {
-    text-align: center;
-    transform: rotate(-90deg);
+td.rotate,
+th.rotate {
+  text-align: center;
+  transform: rotate(-90deg);
 }
 
 tr.lesson-cancelled td {
-    background-color: #EF9A9A;
+  background-color: #ef9a9a;
 }
 
 tr.lesson-substituted td {
-    background-color: #ffb74d;
+  background-color: #ffb74d;
 }
 
 td.lesson-notes {
-    font-size: 80%;
+  font-size: 80%;
 }
 
 td.lesson-notes span.lesson-note-absent {
-    color: #cc0000;
+  color: #cc0000;
 }
 
 td.lesson-notes span.lesson-note-late {
-    color: #ff9933;
+  color: #ff9933;
 }
 
 td.lesson-notes span.lesson-note-excused {
-    color: #009933;
+  color: #009933;
 }
 
 table.person-info {
-    border: none;
+  border: none;
 }
 
 table.person-info td.person-img {
-    text-align: center;
+  text-align: center;
 }
 
 table.person-info td.person-img img {
-    max-height: 30mm;
+  max-height: 30mm;
 }
 
 img.max-size-600 {
-    max-width: 600px;
-    max-height: 600px;
+  max-width: 600px;
+  max-height: 600px;
 }
diff --git a/aleksis/apps/alsijil/static/css/alsijil/lesson.css b/aleksis/apps/alsijil/static/css/alsijil/lesson.css
index fbfa4d8d683d42b8fe003edc54bf10411fbbc7eb..48937d33d5a763d9d8ac6c4dbdfa4c9eae573ac3 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/lesson.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/lesson.css
@@ -1,137 +1,138 @@
 .alsijil-check-box {
-    margin-right: 10px;
+  margin-right: 10px;
 }
 
 .alsijil-check-box [type="checkbox"] {
-    padding-left: 30px;
+  padding-left: 30px;
 }
 
 .alsijil-lesson-cancelled {
-    text-decoration: line-through;
+  text-decoration: line-through;
 }
 
-.alsijil-tardiness-text{
-    vertical-align: super;
+.alsijil-tardiness-text {
+  vertical-align: super;
 }
 
-
 @media only screen and (max-width: 992px) {
-    .no-mobile-card {
-        border: unset;
-        padding: unset;
-        margin: unset;
-        box-shadow: unset;
-    }
-    .no-mobile-card .card-content {
-        padding: unset;
-    }
-    table.alsijil-table.horizontal-on-small {
-        display: block;
-        max-width: calc(100vw - 40px);
-    }
-    table.alsijil-table.horizontal-on-small thead {
-        display: none;
-    }
-    table.alsijil-table.horizontal-on-small tbody {
-        overflow-x: scroll;
-        display: flex;
-        column-gap: 1rem;
-        flex-wrap: nowrap;
-        align-items: stretch;
-        scroll-snap-type: x proximity;
-    }
-
-    table.alsijil-table.horizontal-on-small tr {
-        flex-basis: min(75vw, 400px);
-        flex-shrink: 0;
-        flex-grow: 1;
-        border-radius: 8px;
-        display: flex;
-        flex-direction: column;
-        justify-content: space-between;
-        scroll-snap-align: center;
-        transition: all .5s;
-        margin: 0.5rem 0 1rem 0;
-        background-color: #fff!important;
-    	box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
-        padding: 24px;
-    }
-    table.alsijil-table.horizontal-on-small tr:first-of-type {
-        margin-inline-start: .4rem;
-        -moz-margin-start: .4rem;
-        -webkit-margin-start: .4rem;
-    }
-
-    table.alsijil-table.horizontal-on-small tr:last-of-type {
-        margin-inline-end: .4rem;
-        -moz-margin-end: .4rem;
-        -webkit-margin-end: .4rem;
-    }
-    table.alsijil-table.horizontal-on-small td.center-align {
-        text-align: left;
-    }
-    table.alsijil-table.horizontal-on-small .person-name {
-        font-size: 24px;
-        font-weight: 300;
-        display: block;
-        line-height: 32px;
-        margin-bottom: 8px;
-    }
-}
-
-.alsijil-time-head, .alsijil-object-head {
+  .no-mobile-card {
+    border: unset;
+    padding: unset;
+    margin: unset;
+    box-shadow: unset;
+  }
+  .no-mobile-card .card-content {
+    padding: unset;
+  }
+  table.alsijil-table.horizontal-on-small {
+    display: block;
+    max-width: calc(100vw - 40px);
+  }
+  table.alsijil-table.horizontal-on-small thead {
+    display: none;
+  }
+  table.alsijil-table.horizontal-on-small tbody {
+    overflow-x: scroll;
+    display: flex;
+    column-gap: 1rem;
+    flex-wrap: nowrap;
+    align-items: stretch;
+    scroll-snap-type: x proximity;
+  }
+
+  table.alsijil-table.horizontal-on-small tr {
+    flex-basis: min(75vw, 400px);
+    flex-shrink: 0;
+    flex-grow: 1;
+    border-radius: 8px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    scroll-snap-align: center;
+    transition: all 0.5s;
+    margin: 0.5rem 0 1rem 0;
+    background-color: #fff !important;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
+      0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
+    padding: 24px;
+  }
+  table.alsijil-table.horizontal-on-small tr:first-of-type {
+    margin-inline-start: 0.4rem;
+    -moz-margin-start: 0.4rem;
+    -webkit-margin-start: 0.4rem;
+  }
+
+  table.alsijil-table.horizontal-on-small tr:last-of-type {
+    margin-inline-end: 0.4rem;
+    -moz-margin-end: 0.4rem;
+    -webkit-margin-end: 0.4rem;
+  }
+  table.alsijil-table.horizontal-on-small td.center-align {
+    text-align: left;
+  }
+  table.alsijil-table.horizontal-on-small .person-name {
+    font-size: 24px;
+    font-weight: 300;
     display: block;
+    line-height: 32px;
+    margin-bottom: 8px;
+  }
+}
+
+.alsijil-time-head,
+.alsijil-object-head {
+  display: block;
 }
 
 .alsijil-time-head {
-    font-size: 2rem;
-    line-height: 1.1;
+  font-size: 2rem;
+  line-height: 1.1;
 }
 
 .alsijil-object-head {
-    font-size: 3rem;
+  font-size: 3rem;
 }
 
 @media only screen and (max-width: 600px) {
-    .alsijil-time-head {
-        font-size: 1.5rem;
-    }
+  .alsijil-time-head {
+    font-size: 1.5rem;
+  }
 
-    .alsijil-object-head {
-        font-size: 2.2rem;
-        line-height: 1.4;
-    }
+  .alsijil-object-head {
+    font-size: 2.2rem;
+    line-height: 1.4;
+  }
 }
 
 .alsijil-nav {
-    line-height: 36px;
+  line-height: 36px;
 }
 
 .alsijil-header-nav-button {
-    height: 66px;
-    padding: 0;
+  height: 66px;
+  padding: 0;
 }
 
 .alsijil-header-nav-button.left {
-    margin-right: 5px;
+  margin-right: 5px;
 }
 
 .alsijil-header-nav-button.right {
-    margin-left: 5px;
+  margin-left: 5px;
 }
 
 .alsijil-header-nav-button i.material-icons {
-    line-height: 60px;
-    height: 60px;
-    font-size: 40px;
+  line-height: 60px;
+  height: 60px;
+  font-size: 40px;
 }
 
 .alsijil-nav-header {
-    width: calc(100% + 40px);
-    padding: 10px 20px;
-    margin: -10px -20px 0;
+  width: calc(100% + 40px);
+  padding: 10px 20px;
+  margin: -10px -20px 0;
 }
 
 .tabs-icons .tab svg.iconify {
-    display: block;
+  display: block;
 }
diff --git a/aleksis/apps/alsijil/static/css/alsijil/person.css b/aleksis/apps/alsijil/static/css/alsijil/person.css
index b5a59aae95235f696a06d0641215b1392dd5b2a3..d385d7b69e031fafd4c21d037b70b8f973e99b74 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/person.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/person.css
@@ -1,101 +1,100 @@
 span.input-field.inline > .select-wrapper > input {
-    color: red;
-    padding: 14px 0 0 0;
-    line-height: 2px;
-    height: 36px;
-    vertical-align: middle;
+  color: red;
+  padding: 14px 0 0 0;
+  line-height: 2px;
+  height: 36px;
+  vertical-align: middle;
 }
 
 span.input-field.inline > .select-wrapper .caret {
-    top: 12px !important;
+  top: 12px !important;
 }
 
 @media screen and (min-width: 1400px) {
-    li.collection-item form {
-        margin: -30px 0 -30px 0;
-    }
+  li.collection-item form {
+    margin: -30px 0 -30px 0;
+  }
 
-    li.collection-item#title #select_all_span {
-        margin-top: 5px;
-    }
+  li.collection-item#title #select_all_span {
+    margin-top: 5px;
+  }
 }
 
 .collection {
-    overflow: visible;
-    overflow-x: hidden;
+  overflow: visible;
+  overflow-x: hidden;
 }
 
 #select_all_container {
-    display: none;
+  display: none;
 }
 
 #select_all_box:indeterminate + span:not(.lever):before {
-    top: -4px;
-    left: -6px;
-    width: 10px;
-    height: 12px;
-    border-top: none;
-    border-left: none;
-    border-right: white 2px solid;
-    border-bottom: none;
-    transform: rotate(90deg);
-    backface-visibility: hidden;
-    transform-origin: 100% 100%;
-
+  top: -4px;
+  left: -6px;
+  width: 10px;
+  height: 12px;
+  border-top: none;
+  border-left: none;
+  border-right: white 2px solid;
+  border-bottom: none;
+  transform: rotate(90deg);
+  backface-visibility: hidden;
+  transform-origin: 100% 100%;
 }
 
 #select_all_box:indeterminate + span:not(.lever):after {
-    top: 0;
-    width: 20px;
-    height: 20px;
-    border: 2px solid currentColor;
-    background-color: currentColor;
-    z-index: 0;
+  top: 0;
+  width: 20px;
+  height: 20px;
+  border: 2px solid currentColor;
+  background-color: currentColor;
+  z-index: 0;
 }
 
 #select_all_box_text {
-    color: #9e9e9e !important;
+  color: #9e9e9e !important;
 }
 
 td.material-icons {
-    display: table-cell;
+  display: table-cell;
 }
 
 .medium-high {
-    position: relative;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, 50%);
+  position: relative;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, 50%);
 }
 
 @media screen and (min-width: 600px) {
-    /* On medium and up devices */
-    .medium-high-right {
-        float: right;
-        transform: translate(0%, 50%);
-    }
+  /* On medium and up devices */
+  .medium-high-right {
+    float: right;
+    transform: translate(0%, 50%);
+  }
 }
 
 @media screen and (max-width: 600px) {
-    /* Only on small devices */
-    .full-width-s {
-        width: 100%;
-    }
-
-    #heading {
-        display: block;
-    }
-    #heading + a {
-        float: none!important;
-    }
+  /* Only on small devices */
+  .full-width-s {
+    width: 100%;
+  }
+
+  #heading {
+    display: block;
+  }
+  #heading + a {
+    float: none !important;
+  }
 }
 
 .overflow-x-scroll {
-    overflow-x: scroll;
+  overflow-x: scroll;
 }
 
 figure.modal-content figcaption {
-    font-weight: 300;
-    font-size: 2.28rem;
-    line-height: 110%;
+  font-weight: 300;
+  font-size: 2.28rem;
+  line-height: 110%;
 }
diff --git a/aleksis/apps/alsijil/static/css/alsijil/week_view.css b/aleksis/apps/alsijil/static/css/alsijil/week_view.css
index ccd1595e0fa5ad3f3c10ee8857c644723892e6f2..6aae8540c830a8e3455c9d3094667d676d0349e0 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/week_view.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/week_view.css
@@ -1,116 +1,118 @@
 @media screen and (max-width: 600px) {
-    #toggle-row button[type=submit] {
-        width: 100%;
-        margin-bottom: 1em;
-    }
+  #toggle-row button[type="submit"] {
+    width: 100%;
+    margin-bottom: 1em;
+  }
 }
 
 .horizontal-scroll-container {
-    overflow-x: scroll;
-    display: flex;
-    column-gap: 1rem;
-    flex-wrap: nowrap;
-    align-items: stretch;
-    scroll-snap-type: x proximity;
+  overflow-x: scroll;
+  display: flex;
+  column-gap: 1rem;
+  flex-wrap: nowrap;
+  align-items: stretch;
+  scroll-snap-type: x proximity;
 }
 
 .horizontal-scroll-container.vertical {
-    flex-wrap: wrap;
-    overflow-x: inherit;
+  flex-wrap: wrap;
+  overflow-x: inherit;
 }
 
 .horizontal-scroll-container.vertical .horizontal-scroll-card {
-    margin-inline: 0;
+  margin-inline: 0;
 }
 
 dl {
-    margin: 0;
-    padding: 0;
+  margin: 0;
+  padding: 0;
 }
 
 dt {
-    font-weight: bold;
+  font-weight: bold;
 }
 
 dd {
-    margin: 0;
-    padding: unset;
+  margin: 0;
+  padding: unset;
 }
 
 .horizontal-scroll-card {
-    flex-basis: min(75vw, 400px);
-    flex-shrink: 0;
-    flex-grow: 1;
-    border-radius: 8px;
-    display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-    scroll-snap-align: center;
-    transition: all .5s;
+  flex-basis: min(75vw, 400px);
+  flex-shrink: 0;
+  flex-grow: 1;
+  border-radius: 8px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  scroll-snap-align: center;
+  transition: all 0.5s;
 }
 
 .horizontal-scroll-card:first-of-type {
-    margin-inline-start: .4rem;
-    -moz-margin-start: .4rem;
-    -webkit-margin-start: .4rem;
+  margin-inline-start: 0.4rem;
+  -moz-margin-start: 0.4rem;
+  -webkit-margin-start: 0.4rem;
 }
 
 .horizontal-scroll-card:last-of-type {
-    margin-inline-end: .4rem;
-    -moz-margin-end: .4rem;
-    -webkit-margin-end: .4rem;
+  margin-inline-end: 0.4rem;
+  -moz-margin-end: 0.4rem;
+  -webkit-margin-end: 0.4rem;
 }
 
 .horizontal-scroll-card .card-action {
-    margin-bottom: 5px;
+  margin-bottom: 5px;
 }
 
 .horizontal-scroll-card .card-content .card-title {
-    display: flex;
-    justify-content: space-between;
+  display: flex;
+  justify-content: space-between;
 }
 
 .horizontal-scroll-card .card-content .card-title .subject {
-    flex-grow: 5;
+  flex-grow: 5;
 }
 
 .horizontal-scroll-card .one-line {
-   display: grid;
-    grid-auto-flow: column;
-    grid-template-rows: 1fr 1fr;
+  display: grid;
+  grid-auto-flow: column;
+  grid-template-rows: 1fr 1fr;
 }
 
 p.subtitle {
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-end;
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-end;
 }
 
 .btn-superflat ~ span {
-    line-height: 24px;
+  line-height: 24px;
 }
 
-.btn-superflat, .btn-superflat:focus, .btn-superflat:active {
-    border: none;
-    line-height: 1;
-    height: 24px;
-    background: none;
-    font-weight: normal;
+.btn-superflat,
+.btn-superflat:focus,
+.btn-superflat:active {
+  border: none;
+  line-height: 1;
+  height: 24px;
+  background: none;
+  font-weight: normal;
 }
 
 .btn-superflat i.material-icons {
-    vertical-align: middle;
+  vertical-align: middle;
 }
 
 .btn-superflat:hover {
-    cursor: pointer;
+  cursor: pointer;
 }
 
 .unfold-trigger i.material-icons {
-    transition: transform .5s 0s ease-in-out;
-    transform: rotate(-90deg);
+  transition: transform 0.5s 0s ease-in-out;
+  transform: rotate(-90deg);
 }
 
 .unfold-trigger.vertical i.material-icons {
-    transform: rotate(-180deg);
+  transform: rotate(-180deg);
 }
diff --git a/aleksis/apps/alsijil/static/js/alsijil/week_view.js b/aleksis/apps/alsijil/static/js/alsijil/week_view.js
index c5daa0451b63a63aac4e8b7703beaaa6d8b26fe5..69124b9c41e656948bbced89b06b8d4edaf3b3c2 100644
--- a/aleksis/apps/alsijil/static/js/alsijil/week_view.js
+++ b/aleksis/apps/alsijil/static/js/alsijil/week_view.js
@@ -1,21 +1,20 @@
 $(document).ready(function () {
-    $("#id_group").change(function () {
-        $("#id_teacher").val("").formSelect();
-    });
-    $("#id_teacher").change(function () {
-        $("#id_group").val("").formSelect();
-    });
-    $("#toggle-row.pre-hidden").hide();
-
+  $("#id_group").change(function () {
+    $("#id_teacher").val("").formSelect();
+  });
+  $("#id_teacher").change(function () {
+    $("#id_group").val("").formSelect();
+  });
+  $("#toggle-row.pre-hidden").hide();
 });
 $("#toggle-button").click(function () {
-    $("#toggle-row").toggle();
-})
+  $("#toggle-row").toggle();
+});
 $(".unfold-trigger").click(function (event) {
-    let target = event.target;
-    target.classList.toggle("vertical");
-    let next_container = $(target).parent().next(".horizontal-scroll-container");
-    if (next_container.length >= 1) {
-        next_container[0].classList.toggle("vertical");
-    }
-})
\ No newline at end of file
+  let target = event.target;
+  target.classList.toggle("vertical");
+  let next_container = $(target).parent().next(".horizontal-scroll-container");
+  if (next_container.length >= 1) {
+    next_container[0].classList.toggle("vertical");
+  }
+});
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 7cee4ac8d7b389cd4e838d992ef68750e31386d5..f78ab22097f78ec0e3477000543977f14518d32d 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -883,7 +883,9 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
         stats = []
         for school_term in school_terms:
             stat = {}
-            personal_notes = PersonalNote.objects.filter(person=person,).filter(
+            personal_notes = PersonalNote.objects.filter(
+                person=person,
+            ).filter(
                 Q(lesson_period__lesson__validity__school_term=school_term)
                 | Q(extra_lesson__school_term=school_term)
                 | Q(event__school_term=school_term)