From 361767e0288b43acc3f3a0fa29f27632b1fdb62a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Fri, 5 May 2023 16:43:28 +0200
Subject: [PATCH] finished calendar, past lectures. WIP - lecture view

---
 .../templates/lectures/includes/lecture.html  | 23 ++++++++++
 .../lectures/view_lecture_index.html          | 44 +++++++++----------
 lectures/urls.py                              |  9 +++-
 lectures/views.py                             | 40 +++++++++++++++++
 shared/static/shared/style.css                |  5 +++
 shared/templates/shared/includes/base.html    | 12 ++---
 6 files changed, 101 insertions(+), 32 deletions(-)
 create mode 100644 lectures/templates/lectures/includes/lecture.html

diff --git a/lectures/templates/lectures/includes/lecture.html b/lectures/templates/lectures/includes/lecture.html
new file mode 100644
index 0000000..466d496
--- /dev/null
+++ b/lectures/templates/lectures/includes/lecture.html
@@ -0,0 +1,23 @@
+{% load markdownify %}
+
+<li>
+    <a href="{% url "lectures:view_lecture" lecture.id %}" class="hover:no-underline">
+        <div class="card elevation-6">
+            <div class="card__body p-5 hover:bg-gray-100 duration-100">
+                <h2 class="head-alt-sm mb-4">{{ lecture.name }}</h2>
+
+                <span class="flex gap-2 mb-4">
+                    <span>
+                        <i class="ico--clock mr-1"></i> {{ lecture.timestamp }}
+                    </span>
+                </span>
+
+                {% if lecture.description %}
+                    <div class="prose max-w-none">
+                        {{ lecture.description|markdownify|safe }}
+                    </div>
+                {% endif %}
+            </div>
+        </div>
+    </a>
+</li>
diff --git a/lectures/templates/lectures/view_lecture_index.html b/lectures/templates/lectures/view_lecture_index.html
index 113837f..aeb1227 100644
--- a/lectures/templates/lectures/view_lecture_index.html
+++ b/lectures/templates/lectures/view_lecture_index.html
@@ -37,35 +37,31 @@
             </div>
             <div>
                 <template v-if="isCurrentView('current_lectures')">
-                    <ul class="grid md:grid-cols-2 grid-cols-1 gap-4">
-                        {% for lecture in current_lectures %}
-                            <li class="card elevation-6">
-                                <div class="card__body p-5">
-                                    <h2 class="head-alt-sm mb-4">{{ lecture.name }}</h2>
-
-                                    <span class="flex gap-2 mb-4">
-                                        <span>
-                                            <i class="ico--clock mr-1"></i> {{ lecture.timestamp }}
-                                        </span>
-                                    </span>
-
-                                    {% if lecture.description %}
-                                        <div class="prose max-w-none">
-                                            {{ lecture.description|markdownify|safe }}
-                                        </div>
-                                    {% endif %}
-                                </div>
-                            </li>
-                        {% endfor %}
-                    </ul>
+                    {% if current_lectures %}
+                        <ul class="grid md:grid-cols-2 grid-cols-1 gap-4">
+                            {% for lecture in current_lectures %}
+                                {% include "lectures/includes/lecture.html" with lecture=lecture %}
+                            {% endfor %}
+                        </ul>
+                    {% else %}
+                        <span class="text-gray-600">Žádné dostupné aktuální lekce.</span>
+                    {% endif %}
                 </template>
                 <template v-if="isCurrentView('calendar')">
-                    <div class="__js-root">
-                        <ui-person-calendar events='[]'></ui-person-calendar>
+                    <div>
+                        <ui-person-calendar events='{{ calendar_data|safe }}'></ui-person-calendar>
                     </div>
                 </template>
                 <template v-if="isCurrentView('recordings')">
-                    c
+                    {% if past_lectures %}
+                        <ul class="grid md:grid-cols-2 grid-cols-1 gap-4">
+                            {% for lecture in past_lectures %}
+                                {% include "lectures/includes/lecture.html" with lecture=lecture %}
+                            {% endfor %}
+                        </ul>
+                    {% else %}
+                        <span class="text-gray-600">Žádné dostupné záznamy.</span>
+                    {% endif %}
                 </template>
             </div>
         </ui-view-provider>
diff --git a/lectures/urls.py b/lectures/urls.py
index 461b41f..283593a 100644
--- a/lectures/urls.py
+++ b/lectures/urls.py
@@ -6,8 +6,13 @@ app_name = "lectures"
 urlpatterns = [
     path("", views.view_avilable_groups, name="view_avilable_groups"),
     path(
-        "lectures/<int:group_id>",
+        "groups/<int:group_id>",
         views.view_lecture_index,
         name="view_lecture_index"
-    )
+    ),
+    path(
+        "lectures/<int:lecture_id>",
+        views.view_lecture,
+        name="view_lecture"
+    ),
 ]
diff --git a/lectures/views.py b/lectures/views.py
index 2ae4f25..8cc6301 100644
--- a/lectures/views.py
+++ b/lectures/views.py
@@ -1,7 +1,14 @@
+import datetime
+import json
+
+from itertools import chain
+
 from django.conf import settings
 from django.db import models
 from django.shortcuts import get_object_or_404, render
 from django.utils import timezone
+from django.urls import reverse
+from django_http_exceptions import HTTPExceptions
 from guardian.shortcuts import get_objects_for_user
 
 from .models import Lecture, LectureGroup
@@ -62,6 +69,16 @@ def view_lecture_index(request, group_id: int):
         .all()
     )
 
+    calendar_data = []
+    all_lectures = list(chain(current_lectures, past_lectures))
+
+    for lecture in all_lectures:
+        calendar_data.append({
+            "title": lecture.name,
+            "date": lecture.timestamp.date().isoformat(),
+            "url": reverse("lectures:view_lecture", args={"lecture_id": lecture.id}),
+        })
+
     return render(
         request,
         "lectures/view_lecture_index.html",
@@ -73,5 +90,28 @@ def view_lecture_index(request, group_id: int):
             "group": group,
             "current_lectures": current_lectures,
             "past_lectures": past_lectures,
+            "calendar_data": json.dumps(calendar_data)
+        },
+    )
+
+def view_lecture(request, lecture_id: int):
+    lecture = (
+        get_objects_for_user(request.user, "lectures.view_lecture").
+        filter(id=lecture_id).
+        first()
+    )
+
+    if lecture is not None:
+        raise HTTPExceptions.NOT_FOUND
+
+    return render(
+        request,
+        "lectures/view_lecture.html",
+        {
+            **get_base_context(request),
+            "title": f"{lecture.name}",
+            "description": f"e-Learningová lekce {lecture.name}.",
+            "header_name": lecture.name,
+            "lecture": lecture,
         },
     )
diff --git a/shared/static/shared/style.css b/shared/static/shared/style.css
index ab1bdd1..5465ea1 100644
--- a/shared/static/shared/style.css
+++ b/shared/static/shared/style.css
@@ -1185,6 +1185,11 @@ html {
   font-weight: 700;
 }
 
+.text-gray-600 {
+  --tw-text-opacity: 1;
+  color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
 .text-white {
   --tw-text-opacity: 1;
   color: rgb(255 255 255 / var(--tw-text-opacity));
diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html
index 18663db..e51670a 100644
--- a/shared/templates/shared/includes/base.html
+++ b/shared/templates/shared/includes/base.html
@@ -37,12 +37,12 @@
         >
 
         <link
-            href="https://styleguide.pirati.cz/2.11.x/css/styles.css"
+            href="http://localhost:3000/css/styles.css"
             rel="stylesheet"
             media="all"
         >
         <link
-            href="https://styleguide.pirati.cz/2.11.x/css/pattern-scaffolding.css"
+            href="http://localhost:3000/css/pattern-scaffolding.css"
             rel="stylesheet"
             media="all"
         >
@@ -176,13 +176,13 @@
                             <a href="https://dary.pirati.cz" class="btn btn--icon btn--cyan-200 btn--hoveractive text-lg btn--fullwidth sm:btn--autowidth">
                                 <div class="btn__body-wrap">
                                     <div class="btn__body">Přispěj</div>
-                                    <div class="btn__icon "><i class="ico--pig"></i></div>
+                                    <div class="btn__icon"><i class="ico--pig"></i></div>
                                 </div>
                             </a>
                             <a href="https://nalodeni.pirati.cz" class="btn btn--icon btn--blue-300 btn--hoveractive text-lg btn--fullwidth sm:btn--autowidth">
                                 <div class="btn__body-wrap">
-                                    <div class="btn__body ">Naloď se</div>
-                                    <div class="btn__icon "><i class="ico--anchor"></i></div>
+                                    <div class="btn__body">Naloď se</div>
+                                    <div class="btn__icon"><i class="ico--anchor"></i></div>
                                 </div>
                             </a>
                         </div>
@@ -192,7 +192,7 @@
         </footer>
 
         <script
-            src="https://styleguide.pirati.cz/2.12.x/js/main.bundle.js"
+            src="http://localhost:3000/js/main.bundle.js"
         ></script>
     </body>
 </html>
-- 
GitLab