From 7e89c1d4a221df1ae999d899b0e4473df38e2ecb Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Mon, 10 Feb 2020 20:29:40 +0100 Subject: [PATCH] Add timetable dashboard widget with smart plan --- aleksis/apps/chronos/admin.py | 5 ++ aleksis/apps/chronos/dashboard.py | 67 +++++++++++++++++++ .../templates/chronos/my_timetable.html | 13 +--- .../chronos/partials/lessons_col.html | 10 +++ .../chronos/templates/chronos/widget.html | 27 ++++++++ 5 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 aleksis/apps/chronos/admin.py create mode 100644 aleksis/apps/chronos/dashboard.py create mode 100644 aleksis/apps/chronos/templates/chronos/partials/lessons_col.html create mode 100644 aleksis/apps/chronos/templates/chronos/widget.html diff --git a/aleksis/apps/chronos/admin.py b/aleksis/apps/chronos/admin.py new file mode 100644 index 00000000..1c8506e0 --- /dev/null +++ b/aleksis/apps/chronos/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from .dashboard import TimetableWidget + +admin.site.register(TimetableWidget) diff --git a/aleksis/apps/chronos/dashboard.py b/aleksis/apps/chronos/dashboard.py new file mode 100644 index 00000000..f628cd68 --- /dev/null +++ b/aleksis/apps/chronos/dashboard.py @@ -0,0 +1,67 @@ +from datetime import datetime +from collections import OrderedDict + +from django.forms.widgets import Media +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from django_global_request.middleware import get_request + +from aleksis.apps.chronos.models import TimePeriod +from aleksis.apps.chronos.util.date import get_name_for_day_from_today +from aleksis.apps.chronos.util.prev_next import get_next_relevant_day +from aleksis.core.models import DashboardWidget +from aleksis.core.util.core_helpers import has_person + + +class TimetableWidget(DashboardWidget): + template = "chronos/widget.html" + + def get_context(self): + request = get_request() + context = {"has_plan": True} + wanted_day = get_next_relevant_day(timezone.now().date(), datetime.now().time()) + + if has_person(request.user): + person = request.user.person + + if person.is_teacher: + # Teacher + + type_ = "teacher" + lesson_periods_person = person.lesson_periods_as_teacher + + elif person.primary_group: + # Student + + type_ = "group" + lesson_periods_person = person.lesson_periods_as_participant + + else: + # 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"] = OrderedDict(sorted(per_period.items())) + context["type"] = type_ + context["day"] = wanted_day + context["day_label"] = get_name_for_day_from_today(wanted_day) + context["periods"] = TimePeriod.get_times_dict() + context["smart"] = True + return context + + media = Media(css={ + "all": ("css/chronos/timetable.css",) + }) + + class Meta: + proxy = True + verbose_name = _("Timetable widget") diff --git a/aleksis/apps/chronos/templates/chronos/my_timetable.html b/aleksis/apps/chronos/templates/chronos/my_timetable.html index 90adf8fb..d508fd43 100644 --- a/aleksis/apps/chronos/templates/chronos/my_timetable.html +++ b/aleksis/apps/chronos/templates/chronos/my_timetable.html @@ -50,18 +50,9 @@ </div> </div> + {# Lessons #} - {% for period, lessons in lesson_periods.items %} - <div class="row"> - <div class="col s4"> - {% include "chronos/partials/period_time.html" with period=period periods=periods %} - </div> - <div class="col s8"> - {# A lesson #} - {% include "chronos/partials/lesson.html" with lessons=lessons %} - </div> - </div> - {% endfor %} + {% include "chronos/partials/lessons_col.html" with lesson_periods=lesson_periods %} </div> </div> diff --git a/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html b/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html new file mode 100644 index 00000000..abb2710a --- /dev/null +++ b/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html @@ -0,0 +1,10 @@ +{% for period, lessons in lesson_periods.items %} + <div class="row"> + <div class="col s4"> + {% include "chronos/partials/period_time.html" with period=period periods=periods %} + </div> + <div class="col s8"> + {% include "chronos/partials/lesson.html" with lessons=lessons %} + </div> + </div> +{% endfor %} diff --git a/aleksis/apps/chronos/templates/chronos/widget.html b/aleksis/apps/chronos/templates/chronos/widget.html new file mode 100644 index 00000000..a16f291d --- /dev/null +++ b/aleksis/apps/chronos/templates/chronos/widget.html @@ -0,0 +1,27 @@ +{# -*- engine:django -*- #} + +{% load i18n static %} + +<div class="card"> + <div class="card-content"> + <span class="card-title"> + {% blocktrans with day_label=day_label %} + My timetable for {{ day_label }} + {% endblocktrans %} + </span> + <div class="timetable-plan"> + {% if has_plan %} + {% include "chronos/partials/lessons_col.html" with lesson_periods=lesson_periods %} + {% else %} + <div class="alert warning"> + <p> + <i class="material-icons left">info</i> + {% blocktrans %} + There is no timetable linked to your person. + {% endblocktrans %} + </p> + </div> + {% endif %} + </div> + </div> +</div> -- GitLab