From 00fd4ba22562fe4d0de1faab2f04240a3394f402 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Thu, 13 Feb 2020 17:30:00 +0100 Subject: [PATCH] Refactor out a lot of stuff used by TimetableWidget and my_timetable both to models and model extensions --- aleksis/apps/chronos/model_extensions.py | 30 +++++++++- aleksis/apps/chronos/models.py | 71 +++++++++++++++--------- aleksis/apps/chronos/views.py | 49 ++++++---------- 3 files changed, 90 insertions(+), 60 deletions(-) diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py index 8f16b828..67260090 100644 --- a/aleksis/apps/chronos/model_extensions.py +++ b/aleksis/apps/chronos/model_extensions.py @@ -1,4 +1,6 @@ -from aleksis.core.models import Person +from typing import Optional, Union + +from aleksis.core.models import Person, Group from .models import Lesson, LessonPeriod @@ -10,6 +12,32 @@ def is_teacher(self): return self.lesson_periods_as_teacher.exists() +@Person.property +def timetable_type(self) -> Optional[str]: + """ Return which type of timetable this user has """ + + if self.is_teacher: + return "teacher" + elif self.primary_group: + return "group" + else: + return None + + +@Person.property +def timetable_object(self) -> Optional[Union[Group, Person]]: + """ Return the object which has the user's timetable """ + + type_ = self.timetable_type + + if type_ == "teacher": + return self + elif type_ == "group": + return self.primary_group + else: + return None + + @Person.property def lessons_as_participant(self): """ Return a `QuerySet` containing all `Lesson`s this person diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py index 59449c99..5a6eb38f 100644 --- a/aleksis/apps/chronos/models.py +++ b/aleksis/apps/chronos/models.py @@ -206,6 +206,41 @@ class LessonPeriodQuerySet(LessonDataQuerySet): else: return None + def filter_from_person(self, person: Person) -> Optional[models.QuerySet]: + type_ = person.timetable_type + + if type_ == "teacher": + # Teacher + + return person.lesson_periods_as_teacher + + elif type_ == "group": + # Student + + return person.lesson_periods_as_participant + + else: + # If no student or teacher + return None + + def daily_lessons_for_person(self, person: Person, wanted_day: date) -> Optional[models.QuerySet]: + lesson_periods = LessonPeriod.objects.filter_from_person(person) + + if lesson_periods is None: + return None + + return lesson_periods.on_day(wanted_day) + + def per_period_one_day(self) -> OrderedDict: + """ Group selected lessons per period for one day """ + per_period = {} + for lesson_period in self: + if lesson_period.period.period in per_period: + per_period[lesson_period.period.period].append(lesson_period) + else: + per_period[lesson_period.period.period] = [lesson_period] + return OrderedDict(sorted(per_period.items())) + class LessonSubstitutionQuerySet(LessonDataQuerySet): _period_path = "lesson_period__" @@ -522,37 +557,21 @@ class TimetableWidget(DashboardWidget): if has_person(request.user): person = request.user.person - if person.is_teacher: - # Teacher - - type_ = "teacher" - lesson_periods_person = person.lesson_periods_as_teacher + lesson_periods = LessonPeriod.objects.daily_lessons_for_person(person, wanted_day) + type_ = person.timetable_type - elif person.primary_group: - # Student - - type_ = "group" - lesson_periods_person = person.lesson_periods_as_participant - - else: + if type_ is None: # If no student or teacher, redirect to all timetables context["has_plan"] = False - - lesson_periods = lesson_periods_person.on_day(wanted_day) - - # Build dictionary with lessons - per_period = {} - for lesson_period in lesson_periods: - if lesson_period.period.period in per_period: - per_period[lesson_period.period.period].append(lesson_period) else: - per_period[lesson_period.period.period] = [lesson_period] + context["lesson_periods"] = lesson_periods.per_period_one_day() + context["type"] = type_ + context["day"] = wanted_day + context["periods"] = TimePeriod.get_times_dict() + context["smart"] = True + else: + context["has_plan"] = False - context["lesson_periods"] = OrderedDict(sorted(per_period.items())) - context["type"] = type_ - context["day"] = wanted_day - context["periods"] = TimePeriod.get_times_dict() - context["smart"] = True return context media = Media(css={ diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py index 22ab295f..daad66d7 100644 --- a/aleksis/apps/chronos/views.py +++ b/aleksis/apps/chronos/views.py @@ -62,46 +62,29 @@ def my_timetable( if has_person(request.user): person = request.user.person - if person.is_teacher: - # Teacher + lesson_periods = LessonPeriod.objects.daily_lessons_for_person(person, wanted_day) - type_ = "teacher" - super_el = person - lesson_periods_person = person.lesson_periods_as_teacher - - elif person.primary_group: - # Student - - type_ = "group" - super_el = person.primary_group - lesson_periods_person = person.lesson_periods_as_participant - - else: + if lesson_periods is None: # If no student or teacher, redirect to all timetables return redirect("all_timetables") - lesson_periods = lesson_periods_person.on_day(wanted_day) - - # Build dictionary with lessons - per_period = {} - for lesson_period in lesson_periods: - if lesson_period.period.period in per_period: - per_period[lesson_period.period.period].append(lesson_period) - else: - per_period[lesson_period.period.period] = [lesson_period] + type_ = person.timetable_type + super_el = person.timetable_object - context["lesson_periods"] = OrderedDict(sorted(per_period.items())) - context["super"] = {"type": type_, "el": super_el} - context["type"] = type_ - context["day"] = wanted_day - context["periods"] = TimePeriod.get_times_dict() - context["smart"] = True + context["lesson_periods"] = lesson_periods.per_period_one_day() + context["super"] = {"type": type_, "el": super_el} + context["type"] = type_ + context["day"] = wanted_day + context["periods"] = TimePeriod.get_times_dict() + context["smart"] = True - context["url_prev"], context["url_next"] = TimePeriod.get_prev_next_by_day( - wanted_day, "my_timetable_by_date" - ) + context["url_prev"], context["url_next"] = TimePeriod.get_prev_next_by_day( + wanted_day, "my_timetable_by_date" + ) - return render(request, "chronos/my_timetable.html", context) + return render(request, "chronos/my_timetable.html", context) + else: + return redirect("all_timetables") @login_required -- GitLab