Skip to content
Snippets Groups Projects
prev_next.py 1.42 KiB
from datetime import timedelta, date, time
from typing import Optional, Tuple

from calendarweek import CalendarWeek
from django.urls import reverse
from django.utils import timezone

from ..models import TimePeriod


def get_next_relevant_day(day: Optional[date] = None, time: Optional[time] = None, prev: bool = False) -> date:
    """ Returns next (previous) day with lessons depending on date and time """

    if day is None:
        day = timezone.now().date()

    if time is not None and not prev:
        if time > TimePeriod.time_max:
            day += timedelta(days=1)

    cw = CalendarWeek.from_date(day)

    if day.weekday() > TimePeriod.weekday_max:
        if prev:
            day = cw[TimePeriod.weekday_max]
        else:
            cw += 1
            day = cw[TimePeriod.weekday_min]
    elif day.weekday() < TimePeriod.weekday_min:
        if prev:
            cw -= 1
            day = cw[TimePeriod.weekday_max]
        else:
            day = cw[TimePeriod.weekday_min]

    return day


def get_prev_next_by_day(day: date, url: str) -> Tuple[str, str]:
    """ Build URLs for previous/next day """

    day_prev = get_next_relevant_day(day - timedelta(days=1), prev=True)
    day_next = get_next_relevant_day(day + timedelta(days=1))

    url_prev = reverse(url, args=[day_prev.year, day_prev.month, day_prev.day])
    url_next = reverse(url, args=[day_next.year, day_next.month, day_next.day])

    return url_prev, url_next