Skip to content
Snippets Groups Projects
Verified Commit 731abe3d authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Use out-sourced calendarweek library

parent 80d8f2da
No related branches found
No related tags found
1 merge request!31Biscuit merge. Closes #53.
......@@ -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"))
......
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]:
......
......@@ -20,6 +20,7 @@ classifiers = [
[tool.poetry.dependencies]
python = "^3.7"
calendarweek = "^0.1"
AlekSIS = { path = "../../.." }
[build-system]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment