diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py index 332acc7c380b15cf7b85b4a1eee5d71a6dd7c889..c975925748e2cad62aa3ee8d958c0f3e2fb71b0b 100644 --- a/aleksis/apps/chronos/models.py +++ b/aleksis/apps/chronos/models.py @@ -10,10 +10,12 @@ from django.db.models import F, Q from django.http.request import QueryDict from django.utils.translation import ugettext_lazy as _ +from calendarweek.django import CalendarWeek, i18n_day_names_lazy, i18n_day_abbrs_lazy + from aleksis.core.mixins import ExtensibleModel from aleksis.core.models import Group, Person -from .util import CalendarWeek, week_weekday_from_date +from .util import week_weekday_from_date class LessonPeriodManager(models.Manager): @@ -203,25 +205,8 @@ class LessonSubstitutionQuerySet(LessonDataQuerySet): class TimePeriod(models.Model): - WEEKDAY_CHOICES = [ - (0, _("Sunday")), - (1, _("Monday")), - (2, _("Tuesday")), - (3, _("Wednesday")), - (4, _("Thursday")), - (5, _("Friday")), - (6, _("Saturday")), - ] - - WEEKDAY_CHOICES_SHORT = [ - (0, _("Sun")), - (1, _("Mon")), - (2, _("Tue")), - (3, _("Wed")), - (4, _("Thu")), - (5, _("Fri")), - (6, _("Sat")), - ] + WEEKDAY_CHOICES = i18n_day_names_lazy() + WEEKDAY_CHOICES_SHORT = i18n_day_abbrs_lazy() weekday = models.PositiveSmallIntegerField(verbose_name=_("Week day"), choices=WEEKDAY_CHOICES) period = models.PositiveSmallIntegerField(verbose_name=_("Number of period")) diff --git a/aleksis/apps/chronos/util.py b/aleksis/apps/chronos/util.py index 5af26ed14b1cf83507a853728a595bb6caff1a9d..6e49d8753d1348aed3a270cf8072484806e51cf4 100644 --- a/aleksis/apps/chronos/util.py +++ b/aleksis/apps/chronos/util.py @@ -1,97 +1,7 @@ -from __future__ import annotations +from datetime import date +from typing import Tuple, List -from dataclasses import dataclass -from datetime import date, datetime, timedelta -from typing import Optional, Sequence, Tuple, Union, List - -from django.apps import apps -from django.db import models -from django.utils.translation import ugettext as _ - - -@dataclass -class CalendarWeek: - """ A calendar week defined by year and ISO week number. """ - - year: Optional[int] = None - week: Optional[int] = None - - @classmethod - def from_date(cls, when: date): - """ Get the calendar week by a date object (the week this date is in). """ - - week = int(when.strftime("%V")) - year = when.year + 1 if when.month == 12 and week == 1 else when.year - - return cls(year=year, week=week) - - @classmethod - def current_week(cls) -> int: - """ Get the current week number. """ - - return cls().week - - @classmethod - def weeks_within(cls, start: date, end: date) -> Sequence[CalendarWeek]: - """ Get all calendar weeks within a date range. """ - - if start > end: - raise ValueError("End date must be after start date.") - - current = start - weeks = [] - while current < end: - weeks.append(cls.from_date(current)) - current += timedelta(days=7) - - return weeks - - def __post_init__(self) -> None: - today = date.today() - - if not self.year: - self.year = today.year - if not self.week: - self.week = int(today.strftime("%V")) - - def __str__(self) -> str: - return "%s %d (%s %s %s)" % (_("Calendar Week"), self.week, self[0], _("to"), self[-1],) - - def __len__(self) -> int: - return 7 - - def __getitem__(self, n: int) -> date: - if n < -7 or n > 6: - raise IndexError("Week day %d is out of range." % n) - - if n < 0: - n += 7 - - return datetime.strptime("%d-%d-%d" % (self.year, self.week, n + 1), "%G-%V-%u").date() - - def __contains__(self, day: date) -> bool: - return self.__class__.form_date(day) == self - - def __eq__(self, other: CalendarWeek) -> bool: - return self.year == other.year and self.week == other.week - - def __lt__(self, other: CalendarWeek) -> bool: - return self[0] < other[0] - - def __gt__(self, other: CalendarWeek) -> bool: - return self[0] > other[0] - - def __le__(self, other: CalendarWeek) -> bool: - return self[0] <= other[0] - - def __gr__(self, other: CalendarWeek) -> bool: - return self[0] >= other[0] - - def __add__(self, weeks: int) -> CalendarWeek: - return self.__class__.from_date(self[0] + timedelta(days=weeks * 7)) - - def __sub__(self, weeks: int) -> CalendarWeek: - return self.__class__.from_date(self[0] - timedelta(days=weeks * 7)) +from calendarweek import CalendarWeek def week_weekday_from_date(when: date) -> Tuple[CalendarWeek, int]: diff --git a/pyproject.toml b/pyproject.toml index 9065066e24063dde8042828c88bc814afc7fa639..79c3be725b3dcd43000db33821fc601170f539d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.7" +calendarweek = "^0.1" AlekSIS = { path = "../../.." } [build-system]