From b72abfa7fac77ac85fbff3e2598b53541fe44c59 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 3 May 2020 17:37:10 +0200
Subject: [PATCH] Fix bugs

---
 aleksis/apps/chronos/managers.py              | 47 ++++++++++---------
 .../chronos/partials/groups_part.html         |  2 +-
 aleksis/apps/chronos/views.py                 |  9 ++--
 3 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index 2f32a3e4..c3be80b6 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -70,6 +70,29 @@ class WeekQuerySetMixin:
         return self.annotate(_week=models.Value(week_num, models.IntegerField()))
 
 
+class GroupByPeriodsMixin:
+    def group_by_periods(self, is_person: bool = False) -> dict:
+        """Group a QuerySet of objects with attribute period by period numbers and weekdays."""
+
+        per_period = {}
+        for obj in self:
+            period = obj.period.period
+            weekday = obj.period.weekday
+
+            if period not in per_period:
+                per_period[period] = [] if is_person else {}
+
+            if not is_person and weekday not in per_period[period]:
+                per_period[period][weekday] = []
+
+            if is_person:
+                per_period[period].append(obj)
+            else:
+                per_period[period][weekday].append(obj)
+
+        return per_period
+
+
 class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
     """ Overrides default QuerySet to add specific methods for lesson data. """
 
@@ -174,26 +197,6 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
         return qs1.union(qs2)
 
-    def group_by_periods(self, is_person: bool = False) -> dict:
-        """Group a QuerySet of objects with attribute period by period numbers and weekdays."""
-
-        per_period = {}
-        for obj in self:
-            period = obj.period.period
-            weekday = obj.period.weekday
-
-            if period not in per_period:
-                per_period[period] = [] if is_person else {}
-
-            if not is_person and weekday not in per_period[period]:
-                per_period[period][weekday] = []
-
-            if is_person:
-                per_period[period].append(obj)
-            else:
-                per_period[period][weekday].append(obj)
-
-        return per_period
 
     def filter_from_type(
         self, type_: TimetableType, pk: int
@@ -262,7 +265,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
         return self.annotate_week(week).all()[next_index]
 
 
-class LessonPeriodQuerySet(LessonDataQuerySet):
+class LessonPeriodQuerySet(LessonDataQuerySet, GroupByPeriodsMixin):
     """QuerySet with custom query methods for lesson periods."""
 
     _period_path = ""
@@ -467,7 +470,7 @@ class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
         return self.annotate(_date=models.Value(day, models.DateField()))
 
 
-class ExtraLessonQuerySet(TimetableQuerySet):
+class ExtraLessonQuerySet(TimetableQuerySet, GroupByPeriodsMixin):
     """QuerySet with custom query methods for extra lessons."""
 
     _multiple_rooms = False
diff --git a/aleksis/apps/chronos/templates/chronos/partials/groups_part.html b/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
index 0cae5bce..60980ace 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
@@ -1,4 +1,4 @@
-{% if groups.count > request.site.preferences.chronos__shorten_groups_limit and request.user.preferences.chronos__shorten_groups %}
+{% if groups.count > request.site.preferences.chronos__shorten_groups_limit and request.user.person.preferences.chronos__shorten_groups %}
   {% include "components/text_collapsible.html" with template="chronos/partials/group.html" qs=groups %}
 {% else %}
   {% for group in groups %}
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index 532d0ed9..22f0eced 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -135,6 +135,9 @@ def timetable(
 
     el = get_el_by_pk(request, type_, pk)
 
+    if type(el) == HttpResponseNotFound:
+        return HttpResponseNotFound()
+
     type_ = TimetableType.from_string(type_)
 
     if year and week:
@@ -164,7 +167,7 @@ def timetable(
     context["smart"] = is_smart
     context["week_select"] = {
         "year": wanted_week.year,
-        "dest": reverse("timetable", args=[type_, pk]),
+        "dest": reverse("timetable", args=[type_.value, pk]),
     }
 
     if is_smart:
@@ -178,10 +181,10 @@ def timetable(
     week_next = wanted_week + 1
 
     context["url_prev"] = reverse(
-        "timetable_by_week", args=[type_, pk, week_prev.year, week_prev.week]
+        "timetable_by_week", args=[type_.value, pk, week_prev.year, week_prev.week]
     )
     context["url_next"] = reverse(
-        "timetable_by_week", args=[type_, pk, week_next.year, week_next.week]
+        "timetable_by_week", args=[type_.value, pk, week_next.year, week_next.week]
     )
 
     return render(request, "chronos/timetable.html", context)
-- 
GitLab