diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py index 76dd4c277f7abfbddfacefedc2949282c3936b3b..3706389b28975e65c74cc85ab3fd2d90a2b44498 100644 --- a/aleksis/apps/chronos/views.py +++ b/aleksis/apps/chronos/views.py @@ -1,6 +1,6 @@ from collections import OrderedDict from datetime import date, datetime, timedelta -from typing import Optional +from typing import Optional, Tuple from django.contrib.auth.decorators import login_required from django.db.models import Count @@ -17,30 +17,57 @@ from aleksis.core.models import Person, Group from aleksis.core.util import messages from .forms import LessonSubstitutionForm -from .min_max import period_min, period_max, weekday_min_, weekday_max, get_next_relevant_day +from .min_max import ( + period_min, + period_max, + weekday_min_, + weekday_max, + get_next_relevant_day, +) from .models import LessonPeriod, LessonSubstitution, TimePeriod, Room from .tables import LessonsTable, SubstitutionsTable from .util import CalendarWeek, get_weeks_for_year +def get_prev_next_by_day(day: date, url: str) -> Tuple[str, str]: + """ Build URLs for previous/next day """ + + day_prev = day - timedelta(days=1) + day_next = 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 + + @login_required def all(request: HttpRequest) -> HttpResponse: context = {} - teachers = Person.objects.annotate(lessons_count=Count("lessons_as_teacher")).filter(lessons_count__gt=0) - classes = Group.objects.annotate(lessons_count=Count("lessons")).filter(lessons_count__gt=0, parent_groups=None) - rooms = Room.objects.annotate(lessons_count=Count("lesson_periods")).filter(lessons_count__gt=0) + teachers = Person.objects.annotate( + lessons_count=Count("lessons_as_teacher") + ).filter(lessons_count__gt=0) + classes = Group.objects.annotate(lessons_count=Count("lessons")).filter( + lessons_count__gt=0, parent_groups=None + ) + rooms = Room.objects.annotate(lessons_count=Count("lesson_periods")).filter( + lessons_count__gt=0 + ) - context['teachers'] = teachers - context['classes'] = classes - context['rooms'] = rooms + context["teachers"] = teachers + context["classes"] = classes + context["rooms"] = rooms - return render(request, 'chronos/all.html', context) + return render(request, "chronos/all.html", context) @login_required def my_timetable( - request: HttpRequest, year: Optional[int] = None, month: Optional[int] = None, day: Optional[int] = None + request: HttpRequest, + year: Optional[int] = None, + month: Optional[int] = None, + day: Optional[int] = None, ) -> HttpResponse: context = {} @@ -86,12 +113,21 @@ def my_timetable( context["day"] = wanted_day context["periods"] = TimePeriod.get_times_dict() + context["url_prev"], context["url_next"] = get_prev_next_by_day( + wanted_day, "substitutions_by_day" + ) + return render(request, "chronos/my_timetable.html", context) @login_required def timetable( - request: HttpRequest, type_: str, pk: int, year: Optional[int] = None, week: Optional[int] = None, regular: Optional[str] = None + request: HttpRequest, + type_: str, + pk: int, + year: Optional[int] = None, + week: Optional[int] = None, + regular: Optional[str] = None, ) -> HttpResponse: context = {} @@ -114,38 +150,25 @@ def timetable( lesson_periods = LessonPeriod.objects.in_week(wanted_week) lesson_periods = lesson_periods.filter_from_type(type_, pk) - # else: - # # Redirect to a selected view if no filter provided - # if request.user.person: - # if request.user.person.primary_group: - # return redirect( - # reverse("timetable") + "?group=%d" % request.user.person.primary_group.pk - # ) - # elif lesson_periods.filter(lesson__teachers=request.user.person).exists(): - # return redirect(reverse("timetable") + "?teacher=%d" % request.user.person.pk) # Regroup lesson periods per weekday per_period = {} for lesson_period in lesson_periods: - print(lesson_period.period) added = False - if lesson_period.period.period in per_period : + if lesson_period.period.period in per_period: if lesson_period.period.weekday in per_period[lesson_period.period.period]: - print("HEY HEY") - print(per_period[lesson_period.period.period][lesson_period.period.weekday]) - per_period[lesson_period.period.period][lesson_period.period.weekday].append(lesson_period) - added =True + per_period[lesson_period.period.period][ + lesson_period.period.weekday + ].append(lesson_period) + added = True if not added: per_period.setdefault(lesson_period.period.period, {})[ lesson_period.period.weekday ] = [lesson_period] - print(per_period) - # Fill in empty lessons for period_num in range(period_min, period_max + 1): - print(period_num) # Fill in empty weekdays if period_num not in per_period.keys(): per_period[period_num] = {} @@ -158,11 +181,14 @@ def timetable( # Order this weekday by periods per_period[period_num] = OrderedDict(sorted(per_period[period_num].items())) - print(lesson_periods) context["lesson_periods"] = OrderedDict(sorted(per_period.items())) context["periods"] = TimePeriod.get_times_dict() - 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"] = dict( + TimePeriod.WEEKDAY_CHOICES[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["week"] = wanted_week context["type"] = type_ @@ -173,8 +199,12 @@ def timetable( week_prev = wanted_week - 1 week_next = wanted_week + 1 - context["url_prev"] = reverse("timetable_by_week", args=[type_, pk, week_prev.year, week_prev.week]) - context["url_next"] = reverse("timetable_by_week", args=[type_, pk, week_next.year, week_next.week]) + context["url_prev"] = reverse( + "timetable_by_week", args=[type_, pk, week_prev.year, week_prev.week] + ) + context["url_next"] = reverse( + "timetable_by_week", args=[type_, pk, week_next.year, week_next.week] + ) return render(request, "chronos/timetable.html", context) @@ -201,8 +231,13 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons day_prev = day - timedelta(days=1) day_next = day + timedelta(days=1) - context["url_prev"] = reverse("lessons_day_by_date", args=[day_prev.strftime("%Y-%m-%d")]) - context["url_next"] = reverse("lessons_day_by_date", args=[day_next.strftime("%Y-%m-%d")]) + + context["url_prev"] = reverse( + "lessons_day_by_date", args=[day_prev.strftime("%Y-%m-%d")] + ) + context["url_next"] = reverse( + "lessons_day_by_date", args=[day_next.strftime("%Y-%m-%d")] + ) return render(request, "chronos/lessons_day.html", context) @@ -246,12 +281,12 @@ def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse @admin_required def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse: - context = {} - lesson_period = get_object_or_404(LessonPeriod, pk=id_) wanted_week = lesson_period.lesson.get_calendar_week(week) - LessonSubstitution.objects.filter(week=wanted_week.week, lesson_period=lesson_period).delete() + LessonSubstitution.objects.filter( + week=wanted_week.week, lesson_period=lesson_period + ).delete() messages.success(request, _("The substitution has been deleted.")) return redirect( @@ -261,7 +296,10 @@ def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpRespon def substitutions( - request: HttpRequest, year: Optional[int] = None, month: Optional[int] = None, day: Optional[int] = None + request: HttpRequest, + year: Optional[int] = None, + month: Optional[int] = None, + day: Optional[int] = None, ) -> HttpResponse: context = {} @@ -273,22 +311,11 @@ def substitutions( substitutions = LessonSubstitution.objects.on_day(wanted_day) - # Prepare table - substitutions_table = SubstitutionsTable(substitutions) - RequestConfig(request).configure(substitutions_table) - - context["current_head"] = str(wanted_day) - context["substitutions_table"] = substitutions_table context["substitutions"] = substitutions context["day"] = wanted_day - day_prev = wanted_day - timedelta(days=1) - day_next = wanted_day + timedelta(days=1) - context["url_prev"] = "%s" % ( - reverse("substitutions_by_day", args=[day_prev.year, day_prev.month, day_prev.day]) - ) - context["url_next"] = "%s" % ( - reverse("substitutions_by_day", args=[day_next.year, day_next.month, day_next.day]) + context["url_prev"], context["url_next"] = get_prev_next_by_day( + wanted_day, "substitutions_by_day" ) return render(request, "chronos/substitutions.html", context)