diff --git a/aleksis/apps/chronos/util/chronos_helpers.py b/aleksis/apps/chronos/util/chronos_helpers.py
new file mode 100644
index 0000000000000000000000000000000000000000..11b1c5b9c697a5d6fbc787cac70a5ff9c96615c4
--- /dev/null
+++ b/aleksis/apps/chronos/util/chronos_helpers.py
@@ -0,0 +1,35 @@
+from typing import Optional
+
+from django.http import HttpRequest, HttpResponseNotFound
+from django.shortcuts import get_object_or_404
+
+from aleksis.core.models import Person, Group
+from ..managers import TimetableType
+from ..models import LessonPeriod, LessonSubstitution, Room
+
+
+def get_el_by_pk(
+    request: HttpRequest,
+    type_: str,
+    pk: int,
+    year: Optional[int] = None,
+    week: Optional[int] = None,
+    regular: Optional[str] = None,
+):
+    if type_ == TimetableType.GROUP.value:
+        return get_object_or_404(Group, pk=pk)
+    elif type_ == TimetableType.TEACHER.value:
+        return get_object_or_404(Person, pk=pk)
+    elif type_ == TimetableType.ROOM.value:
+        return get_object_or_404(Room, pk=pk)
+    else:
+        return HttpResponseNotFound()
+
+
+def get_substitution_by_id(request: HttpRequest, id_: int, week: int):
+    lesson_period = get_object_or_404(LessonPeriod, pk=id_)
+    wanted_week = lesson_period.lesson.get_calendar_week(week)
+
+    return LessonSubstitution.objects.filter(
+        week=wanted_week.week, lesson_period=lesson_period
+    ).first()
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index 04e975f7ea3d138baefdb05ec754cff8f13feef2..96a332d946053fcb6364c717e3c4e4cea07bac7e 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -20,6 +20,7 @@ from .managers import TimetableType
 from .models import Absence, Holiday, LessonPeriod, LessonSubstitution, Room, TimePeriod
 from .tables import LessonsTable
 from .util.build import build_substitutions_list, build_timetable, build_weekdays
+from .util.chronos_helpers import get_el_by_pk, get_substitution_by_id
 from .util.date import CalendarWeek, get_weeks_for_year
 from .util.js import date_unix
 
@@ -96,24 +97,6 @@ def my_timetable(
         return redirect("all_timetables")
 
 
-def get_el_by_pk(
-    request: HttpRequest,
-    type_: str,
-    pk: int,
-    year: Optional[int] = None,
-    week: Optional[int] = None,
-    regular: Optional[str] = None,
-):
-    if type_ == TimetableType.GROUP.value:
-        return get_object_or_404(Group, pk=pk)
-    elif type_ == TimetableType.TEACHER.value:
-        return get_object_or_404(Person, pk=pk)
-    elif type_ == TimetableType.ROOM.value:
-        return get_object_or_404(Room, pk=pk)
-    else:
-        return HttpResponseNotFound()
-
-
 @permission_required("chronos.view_timetable", fn=get_el_by_pk)
 def timetable(
     request: HttpRequest,
@@ -222,15 +205,6 @@ def lessons_day(
     return render(request, "chronos/lessons_day.html", context)
 
 
-def get_substitution_by_id(request: HttpRequest, id_: int, week: int):
-    lesson_period = get_object_or_404(LessonPeriod, pk=id_)
-    wanted_week = lesson_period.lesson.get_calendar_week(week)
-
-    return LessonSubstitution.objects.filter(
-        week=wanted_week.week, lesson_period=lesson_period
-    ).first()
-
-
 @permission_required("chronos.edit_substitution", fn=get_substitution_by_id)
 def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse:
     """View a form to edit a substitution lessen."""