From 3a07d8c0dd5d3f39d19796ed79d59f87669031ed Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 1 Nov 2020 16:05:24 +0100
Subject: [PATCH] Add helper methods for getting next/previous lesson of a
 person on a day

---
 aleksis/apps/chronos/model_extensions.py | 33 ++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py
index 3a288a29..917a5dba 100644
--- a/aleksis/apps/chronos/model_extensions.py
+++ b/aleksis/apps/chronos/model_extensions.py
@@ -1,3 +1,4 @@
+from datetime import date
 from typing import Optional, Union
 
 from django.utils.translation import gettext_lazy as _
@@ -79,6 +80,38 @@ def lesson_periods_as_teacher(self):
     return LessonPeriod.objects.filter(lesson__teachers=self)
 
 
+@Person.method
+def daily_lessons(self, day: date):
+    """Get all lessons of this person on the given day."""
+    return LessonPeriod.objects.on_day(day).filter_from_person(self)
+
+
+@Person.method
+def next_lesson(self, lesson_period: "LessonPeriod", day: date) -> Union["LessonPeriod", None]:
+    """Get next lesson of the person on the same day."""
+    daily_lessons = self.daily_lessons(day)
+    ids = list(daily_lessons.values_list("id", flat=True))
+    index = ids.index(lesson_period.pk)
+
+    if index + 1 < len(ids):
+        return daily_lessons[index + 1]
+    else:
+        return None
+
+
+@Person.method
+def previous_lesson(self, lesson_period: "LessonPeriod", day: date) -> Union["LessonPeriod", None]:
+    """Get previous lesson of the person on the same day."""
+    daily_lessons = self.daily_lessons(day)
+    ids = list(daily_lessons.values_list("id", flat=True))
+    index = ids.index(lesson_period.pk)
+
+    if index > 0:
+        return daily_lessons[index - 1]
+    else:
+        return None
+
+
 def for_timetables(cls):
     """Return all announcements that should be shown in timetable views."""
     return cls.objects.filter(show_in_timetables=True)
-- 
GitLab