Newer
Older
return TimePeriod.from_period(TimePeriod.period_max, day)

Jonathan Weth
committed
return self.period_to
@property
def period_from_on_day(self) -> int:

Jonathan Weth
committed
"""Get start period on the annotated day (as period number).
If there is no date annotated, it will use the current date.
"""

Jonathan Weth
committed
return self.raw_period_from_on_day.period
@property
def period_to_on_day(self) -> int:

Jonathan Weth
committed
"""Get end period on the annotated day (as period number).
If there is no date annotated, it will use the current date.
"""

Jonathan Weth
committed
return self.raw_period_to_on_day.period

Jonathan Weth
committed
def get_start_weekday(self, week: CalendarWeek) -> int:
"""Get start date of an event in a specific week."""

Jonathan Weth
committed
if self.date_start < week[TimePeriod.weekday_min]:
return TimePeriod.weekday_min
else:
return self.date_start.weekday()

Jonathan Weth
committed
def get_end_weekday(self, week: CalendarWeek) -> int:
"""Get end date of an event in a specific week."""

Jonathan Weth
committed
if self.date_end > week[TimePeriod.weekday_max]:
return TimePeriod.weekday_max

Jonathan Weth
committed
return self.date_end.weekday()
def annotate_day(self, day: date):
"""Annotate event with the provided date."""
self._date = day
def get_groups(self) -> models.query.QuerySet:

Jonathan Weth
committed
"""Get groups relation."""
return self.groups
def get_teachers(self) -> models.query.QuerySet:

Jonathan Weth
committed
"""Get teachers relation."""
return self.teachers
# Heads up: Link to period implies uniqueness per site
indexes = [
models.Index(
fields=["date_start", "date_end"],
include=["period_from", "period_to"],
name="event_date_start_date_end",
)
]
class ExtraLesson(
GroupPropertiesMixin, TeacherPropertiesMixin, WeekRelatedMixin, SchoolTermRelatedExtensibleModel
):

Jonathan Weth
committed
objects = ExtraLessonManager.from_queryset(ExtraLessonQuerySet)()
week = models.IntegerField(verbose_name=_("Week"), default=CalendarWeek.current_week)
year = models.IntegerField(verbose_name=_("Year"), default=get_current_year)
"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.CASCADE, null=True, related_name="extra_lessons", verbose_name=_("Room"),
comment = models.CharField(verbose_name=_("Comment"), blank=True, null=True, max_length=255)
return f"{self.week}, {self.period}, {self.subject}"
def get_groups(self) -> models.query.QuerySet:

Jonathan Weth
committed
"""Get groups relation."""
return self.groups
def get_teachers(self) -> models.query.QuerySet:

Jonathan Weth
committed
"""Get teachers relation."""
return self.teachers

Jonathan Weth
committed
def get_subject(self) -> Subject:
"""Get subject."""
return self.subject
# Heads up: Link to period implies uniqueness per site
verbose_name = _("Extra lesson")
verbose_name_plural = _("Extra lessons")
indexes = [models.Index(fields=["week", "year"], name="extra_lesson_week_year")]
class Meta:
managed = False
permissions = (

Hangzhi Yu
committed
("view_all_room_timetables", _("Can view all room timetables")),
("view_all_group_timetables", _("Can view all group timetables")),
("view_all_person_timetables", _("Can view all person timetables")),
("view_timetable_overview", _("Can view timetable overview")),
("view_lessons_day", _("Can view all lessons per day")),
)