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