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