Newer
Older
return self.filter_teacher(person)
# Student
return self.filter_participant(person)
else:
# If no student or teacher
return None
class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
def annotate_day(self, day: date):
""" Annotate all events in the QuerySet with the provided date. """
return self.annotate(_date=models.Value(day, models.DateField()))
class Event(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin):
label_ = "event"
objects = models.Manager.from_queryset(EventQuerySet)()
title = models.CharField(verbose_name=_("Title"), max_length=255, blank=True, null=True)
date_start = models.DateField(verbose_name=_("Start date"), null=True)
date_end = models.DateField(verbose_name=_("End date"), null=True)
period_from = models.ForeignKey("TimePeriod", on_delete=models.CASCADE, verbose_name=_("Start time period"), related_name="+")
period_to = models.ForeignKey("TimePeriod", on_delete=models.CASCADE, verbose_name=_("End time period"), related_name="+")
groups = models.ManyToManyField("core.Group", related_name="events", verbose_name=_("Groups"))
rooms = models.ManyToManyField("Room", related_name="events", verbose_name=_("Rooms"))
teachers = models.ManyToManyField("core.Person", related_name="events", verbose_name=_("Teachers"))
def __str__(self):
if self.title:
return self.title
else:
return _("Event {}".format(self.pk))
@property
def period_from_on_day(self) -> int:
day = getattr(self, "_date", timezone.now().date())
if day != self.date_start:
return TimePeriod.period_min
else:
return self.period_from.period
@property
def period_to_on_day(self) -> int:
day = getattr(self, "_date", timezone.now().date())
if day != self.date_end:
return TimePeriod.period_max
else:
return self.period_to.period
indexes = [models.Index(fields=["period_from", "period_to", "date_start", "date_end"])]
class ExtraLessonQuerySet(TimetableQuerySet):
_multiple_rooms = False
def within_dates(self, start: date, end: date):
week_start = CalendarWeek.from_date(start)
week_end = CalendarWeek.from_date(end)
return self.filter(
week__gte=week_start.week,
week__lte=week_end.week,
period__weekday__gte=start.weekday(),
period__weekday__lte=end.weekday(),
)
def on_day(self, day:date):
class ExtraLesson(ExtensibleModel, GroupPropertiesMixin):
objects = models.Manager.from_queryset(ExtraLessonQuerySet)()
week = models.IntegerField(verbose_name=_("Week"), default=CalendarWeek.current_week)
period = models.ForeignKey("TimePeriod", models.CASCADE, related_name="extra_lessons", verbose_name=_("Time period"))
subject = models.ForeignKey("Subject", on_delete=models.CASCADE, related_name="extra_lessons", verbose_name=_("Subject"))
groups = models.ManyToManyField("core.Group", related_name="extra_lessons", verbose_name=_("Groups"))
teachers = models.ManyToManyField("core.Person", related_name="extra_lessons_as_teacher", verbose_name=_("Teachers"))
room = models.ForeignKey("Room", models.CASCADE, null=True, related_name="extra_lessons", verbose_name=_("Room"))
comment = models.CharField(verbose_name=_("Comment"), blank=True, null=True, max_length=255)
def __str__(self):
return "{}, {}, {}".format(self.week, self.period, self.subject)
class Meta:
verbose_name = _("Extra lesson")
verbose_name_plural = _("Extra lessons")
class GlobalPermissions(ExtensibleModel):
class Meta:
managed = False
permissions = (
("view_all_timetables", _("Can view all timetables")),
("view_timetable_overview", _("Can view timetable overview")),
("view_lessons_day", _("Can view all lessons per day")),
)