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