From 122cb456fc0b7afedbab20c919ed0ec21d8795a1 Mon Sep 17 00:00:00 2001
From: Dominik George <nik@naturalnet.de>
Date: Tue, 3 Sep 2019 15:40:08 +0200
Subject: [PATCH] Make timetable view aware of current week and lesson dates.
 Closes #15, #16.

---
 biscuit/apps/chronos/models.py                     |  2 +-
 .../apps/chronos/templates/chronos/tt_week.html    | 14 ++++++++++++++
 biscuit/apps/chronos/urls.py                       |  1 +
 biscuit/apps/chronos/views.py                      | 13 ++++++++++---
 4 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py
index 0d4eec2d..756391b3 100644
--- a/biscuit/apps/chronos/models.py
+++ b/biscuit/apps/chronos/models.py
@@ -125,7 +125,7 @@ class LessonPeriod(models.Model):
     room = models.ForeignKey('Room', models.CASCADE, null=True, related_name='lesson_periods')
 
     def get_substitution(self, week: Optional[int] = None) -> LessonSubstitution:
-        wanted_week = week or current_week()
+        wanted_week = week or getattr(self, '_week', None) or current_week()
         return self.substitutions.filter(week=wanted_week).first()
 
     def get_subject(self) -> Optional[Subject]:
diff --git a/biscuit/apps/chronos/templates/chronos/tt_week.html b/biscuit/apps/chronos/templates/chronos/tt_week.html
index 8fe3d853..3a2f80f4 100644
--- a/biscuit/apps/chronos/templates/chronos/tt_week.html
+++ b/biscuit/apps/chronos/templates/chronos/tt_week.html
@@ -10,6 +10,20 @@
 {% block page_title %}Timetable{% endblock %}
 
 {% block content %}
+<div class="d-flex justify-content-between">
+ <div>
+  <h1>{{ day }}</h1>
+ </div>
+ <div class="btn-group" role="group" aria-label="Day actions">
+  <a href="{% url 'timetable_by_week' week_prev %}" class="btn btn-secondary">
+   {% fa 'arrow-left' %}
+  </a>
+  <a href="{% url 'timetable_by_week' week_next %}" class="btn btn-secondary">
+   {% fa 'arrow-right' %}
+  </a>
+ </div>
+</div>
+
  <form method="get">
   <ul id="timetable_select_form">
    {{ select_form.as_ul }}
diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py
index 87e879b7..e3a9751a 100644
--- a/biscuit/apps/chronos/urls.py
+++ b/biscuit/apps/chronos/urls.py
@@ -5,6 +5,7 @@ from . import views
 
 urlpatterns = [
     path('timetable', views.timetable, name='timetable'),
+    path('timetable/<int:week>', views.timetable, name='timetable_by_week'),
     path('lessons', views.lessons_day, name='lessons_day'),
     path('lessons/<when>', views.lessons_day, name='lessons_day_by_date'),
     path('lessons/<int:id_>/<int:week>/substition', views.edit_substitution, name='edit_substitution')
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 5b445621..6fa61d12 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -23,10 +23,15 @@ from .tables import LessonsTable
 
 @login_required
 @cache_page(60 * 60 * 12)
-def timetable(request: HttpRequest) -> HttpResponse:
+def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse:
     context = {}
 
-    lesson_periods = LessonPeriod.objects.all()
+    wanted_week = week or current_week()
+
+    lesson_periods = LessonPeriod.objects.filter(
+        lesson__date_start__gte=week_days(wanted_week)[0],
+        lesson__date_end__lte=week_days(wanted_week)[-1]
+    ).extra(select={'_week': wanted_week})
 
     if request.GET.get('group', None) or request.GET.get('teacher', None) or request.GET.get('room', None):
         # Incrementally filter lesson periods by GET parameters
@@ -81,7 +86,9 @@ def timetable(request: HttpRequest) -> HttpResponse:
     context['lesson_periods'] = OrderedDict(sorted(per_day.items()))
     context['periods'] = TimePeriod.get_times_dict()
     context['weekdays'] = dict(TimePeriod.WEEKDAY_CHOICES)
-    context['current_week'] = current_week()
+    context['week'] = wanted_week
+    context['week_prev'] = wanted_week - 1
+    context['week_next'] = wanted_week + 1
     context['select_form'] = select_form
 
     return render(request, 'chronos/tt_week.html', context)
-- 
GitLab