-
Jonathan Weth authoredJonathan Weth authored
mixins.py 1.72 KiB
from datetime import date
from typing import Union
from django.db import models
from django.utils.translation import gettext as _
from calendarweek import CalendarWeek
from aleksis.apps.chronos.util.date import week_weekday_to_date
from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations
from aleksis.core.mixins import ExtensibleModel
from .managers import ValidityRangeRelatedQuerySet
class ValidityRangeRelatedExtensibleModel(ExtensibleModel):
"""Add relation to validity range."""
objects = AlekSISBaseManagerWithoutMigrations.from_queryset(ValidityRangeRelatedQuerySet)()
validity = models.ForeignKey(
"chronos.ValidityRange",
on_delete=models.CASCADE,
related_name="+",
verbose_name=_("Linked validity range"),
null=True,
blank=True,
)
class Meta:
abstract = True
class WeekRelatedMixin:
@property
def date(self) -> date:
period = self.lesson_period.period if hasattr(self, "lesson_period") else self.period
return week_weekday_to_date(self.calendar_week, period.weekday)
@property
def calendar_week(self) -> CalendarWeek:
return CalendarWeek(week=self.week, year=self.year)
class WeekAnnotationMixin:
def annotate_week(self, week: CalendarWeek):
"""Annotate this lesson with the number of the provided calendar week."""
self._week = week.week
self._year = week.year
@property
def week(self) -> Union[CalendarWeek, None]:
"""Get annotated week as `CalendarWeek`.
Defaults to `None` if no week is annotated.
"""
if hasattr(self, "_week"):
return CalendarWeek(week=self._week, year=self._year)
else:
return None