Skip to content
Snippets Groups Projects
Verified Commit 3fb10e8e authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add get_next_relevant_day to views

parent e494f43a
No related branches found
No related tags found
1 merge request!31Biscuit merge. Closes #53.
from collections import OrderedDict from collections import OrderedDict
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta, time
from typing import Optional from typing import Optional, Union
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db.models import Count, Max, Min from django.db.models import Count, Max, Min
...@@ -21,6 +21,46 @@ from .models import LessonPeriod, LessonSubstitution, TimePeriod, Room ...@@ -21,6 +21,46 @@ from .models import LessonPeriod, LessonSubstitution, TimePeriod, Room
from .tables import LessonsTable, SubstitutionsTable from .tables import LessonsTable, SubstitutionsTable
from .util import CalendarWeek, get_weeks_for_year from .util import CalendarWeek, get_weeks_for_year
# Determine overall first and last day and period
min_max = TimePeriod.objects.aggregate(
Min("period"), Max("period"), Min("weekday"), Max("weekday"), Min("time_start"), Max("time_end")
)
period_min = min_max.get("period__min", 1)
period_max = min_max.get("period__max", 7)
time_min = min_max.get("time_start__min", None)
time_max = min_max.get("time_end__max", None)
weekday_min_ = min_max.get("weekday__min", 0)
weekday_max = min_max.get("weekday__max", 6)
def get_next_relevant_day(day: Union[date, None] = None, time: Union[time, None] = None):
if day is None:
day = timezone.now().date()
if time is not None:
if time > time_max:
day += timedelta(days=1)
cw = CalendarWeek.from_date(day)
# Remap to Sunday first
weekday = 0 if day.weekday() == 6 else day.weekday() + 1
if weekday > weekday_max or (weekday < weekday_min_):
if weekday > weekday_max or weekday == 0:
cw += 1
# Remap to Monday first
weekday_min = weekday_min_ - 1
# TODO: Probably causes problems
day = cw[weekday_min]
return day
@login_required @login_required
def all(request: HttpRequest) -> HttpResponse: def all(request: HttpRequest) -> HttpResponse:
...@@ -55,11 +95,10 @@ def timetable( ...@@ -55,11 +95,10 @@ def timetable(
if year and week: if year and week:
wanted_week = CalendarWeek(year=year, week=week) wanted_week = CalendarWeek(year=year, week=week)
else: else:
# TODO: On not used days show next week
wanted_week = CalendarWeek() wanted_week = CalendarWeek()
lesson_periods = LessonPeriod.objects.in_week(wanted_week) lesson_periods = LessonPeriod.objects.in_week(wanted_week)
lesson_periods = lesson_periods.filter_from_type(_type, pk) lesson_periods = lesson_periods.filter_from_type(_type, pk)
# else: # else:
# # Redirect to a selected view if no filter provided # # Redirect to a selected view if no filter provided
...@@ -89,16 +128,6 @@ def timetable( ...@@ -89,16 +128,6 @@ def timetable(
] = [lesson_period] ] = [lesson_period]
print(per_period) print(per_period)
# Determine overall first and last day and period
min_max = TimePeriod.objects.aggregate(
Min("period"), Max("period"), Min("weekday"), Max("weekday")
)
period_min = min_max.get("period__min", 1)
period_max = min_max.get("period__max", 7)
weekday_min = min_max.get("weekday__min", 0)
weekday_max = min_max.get("weekday__max", 6)
# Fill in empty lessons # Fill in empty lessons
for period_num in range(period_min, period_max + 1): for period_num in range(period_min, period_max + 1):
...@@ -108,7 +137,7 @@ def timetable( ...@@ -108,7 +137,7 @@ def timetable(
per_period[period_num] = {} per_period[period_num] = {}
# Fill in empty lessons on this workday # Fill in empty lessons on this workday
for weekday_num in range(weekday_min, weekday_max + 1): for weekday_num in range(weekday_min_, weekday_max + 1):
if weekday_num not in per_period[period_num].keys(): if weekday_num not in per_period[period_num].keys():
per_period[period_num][weekday_num] = [] per_period[period_num][weekday_num] = []
...@@ -118,8 +147,8 @@ def timetable( ...@@ -118,8 +147,8 @@ def timetable(
print(lesson_periods) print(lesson_periods)
context["lesson_periods"] = OrderedDict(sorted(per_period.items())) context["lesson_periods"] = OrderedDict(sorted(per_period.items()))
context["periods"] = TimePeriod.get_times_dict() context["periods"] = TimePeriod.get_times_dict()
context["weekdays"] = dict(TimePeriod.WEEKDAY_CHOICES[weekday_min:weekday_max + 1]) context["weekdays"] = dict(TimePeriod.WEEKDAY_CHOICES[weekday_min_:weekday_max + 1])
context["weekdays_short"] = dict(TimePeriod.WEEKDAY_CHOICES_SHORT[weekday_min:weekday_max + 1]) context["weekdays_short"] = dict(TimePeriod.WEEKDAY_CHOICES_SHORT[weekday_min_:weekday_max + 1])
context["weeks"] = get_weeks_for_year(year=wanted_week.year) context["weeks"] = get_weeks_for_year(year=wanted_week.year)
context["week"] = wanted_week context["week"] = wanted_week
context["type"] = _type context["type"] = _type
...@@ -224,8 +253,9 @@ def substitutions( ...@@ -224,8 +253,9 @@ def substitutions(
if day: if day:
wanted_day = timezone.datetime(year=year, month=month, day=day).date() wanted_day = timezone.datetime(year=year, month=month, day=day).date()
wanted_day = get_next_relevant_day(wanted_day)
else: else:
wanted_day = timezone.now().date() wanted_day = get_next_relevant_day(timezone.now().date(), datetime.now().time())
substitutions = LessonSubstitution.objects.on_day(wanted_day) substitutions = LessonSubstitution.objects.on_day(wanted_day)
......
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