From b9f4bc213ca0efc95d867f0aafd569ee0f5b08d6 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 21 May 2023 21:36:44 +0200
Subject: [PATCH] [WIP] Implement lesson event on base of calendar event

---
 aleksis/apps/chronos/models.py | 84 +++++++++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 2 deletions(-)

diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index ed690500..9b486d9b 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -1,5 +1,4 @@
 # flake8: noqa: DJ01
-
 from __future__ import annotations
 
 import os
@@ -60,6 +59,8 @@ from aleksis.apps.chronos.mixins import (
 from aleksis.apps.chronos.util.change_tracker import _get_substitution_models, substitutions_changed
 from aleksis.apps.chronos.util.date import get_current_year
 from aleksis.apps.chronos.util.format import format_m2m
+from aleksis.apps.cursus import models as cursus_models
+from aleksis.apps.cursus.models import Course
 from aleksis.apps.resint.models import LiveDocument
 from aleksis.core.managers import CurrentSiteManagerWithoutMigrations
 from aleksis.core.mixins import (
@@ -67,7 +68,7 @@ from aleksis.core.mixins import (
     GlobalPermissionModel,
     SchoolTermRelatedExtensibleModel,
 )
-from aleksis.core.models import DashboardWidget, Group, Room, SchoolTerm
+from aleksis.core.models import CalendarEvent, DashboardWidget, Group, Person, Room, SchoolTerm
 from aleksis.core.util.core_helpers import has_person
 from aleksis.core.util.pdf import generate_pdf_from_template
 
@@ -1362,3 +1363,82 @@ class ChronosGlobalPermissions(GlobalPermissionModel):
             ("view_lessons_day", _("Can view all lessons per day")),
             ("view_supervisions_day", _("Can view all supervisions per day")),
         )
+
+
+class LessonEvent(CalendarEvent):
+    name = "lesson"
+    verbose_name = _("Lesson")
+
+    title = models.CharField(verbose_name=_("Name"), max_length=255, blank=True)
+
+    course = models.ForeignKey(
+        Course, on_delete=models.CASCADE, verbose_name=_("Course"), null=True, blank=True
+    )
+
+    groups = models.ManyToManyField(
+        Group,
+        related_name="lesson_events",
+        verbose_name=_("Groups"),
+    )
+
+    rooms = models.ManyToManyField(
+        Room,
+        verbose_name=_("Rooms"),
+        related_name="lesson_events",
+        blank=True,
+    )
+    teachers = models.ManyToManyField(
+        Person,
+        verbose_name=_("Teachers"),
+        related_name="lesson_events_as_teacher",
+        blank=True,
+    )
+    subject = models.ForeignKey(
+        cursus_models.Subject,
+        on_delete=models.CASCADE,
+        verbose_name=_("Subject"),
+        related_name="lesson_events",
+        blank=True,
+        null=True,
+    )
+
+    @classmethod
+    def value_title(cls, reference_object: "CalendarEvent") -> str:
+        """Get the title of the event."""
+        if reference_object.title:
+            return reference_object.title
+        elif reference_object.subject:
+            return (
+                reference_object.subject.name
+                + " · "
+                + ", ".join([g.name for g in reference_object.groups.all()])
+            )
+
+        return _("Lesson")
+
+    @classmethod
+    def value_description(cls, reference_object: "CalendarEvent") -> str:
+        return ""
+
+    @classmethod
+    def value_color(cls, reference_object: "CalendarEvent") -> str:
+        """Get the color of the event."""
+        return (
+            reference_object.subject.colour_bg
+            if reference_object.subject
+            else super().value_color(reference_object)
+        )
+
+    @classmethod
+    def get_objects(cls, request) -> Iterable:
+        """Return all objects that should be included in the calendar."""
+        return (
+            super()
+            .get_objects(request)
+            .filter(Q(teachers=request.user.person) | Q(groups__members=request.user.person))
+            .distinct()
+        )
+
+    class Meta:
+        verbose_name = _("Lesson Event")
+        verbose_name_plural = _("Lesson Events")
-- 
GitLab