From 71bf74382abb4b7910b00533e8492a1fd744030e Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Thu, 20 Aug 2020 19:16:48 +0200
Subject: [PATCH] Add students list for quick access

---
 aleksis/apps/alsijil/menus.py                 |  8 +++++-
 .../alsijil/class_register/persons.html       | 26 +++++++++++++++++++
 aleksis/apps/alsijil/urls.py                  |  3 ++-
 aleksis/apps/alsijil/views.py                 | 24 +++++++++++------
 4 files changed, 51 insertions(+), 10 deletions(-)
 create mode 100644 aleksis/apps/alsijil/templates/alsijil/class_register/persons.html

diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index 8869d3337..d20c88b56 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -24,12 +24,18 @@ MENUS = {
                     "icon": "view_week",
                     "validators": ["menu_generator.validators.is_authenticated"],
                 },
-{
+                {
                     "name": _("My overview"),
                     "url": "overview_me",
                     "icon": "insert_chart",
                     "validators": ["menu_generator.validators.is_authenticated"],
                 },
+                {
+                    "name": _("My students"),
+                    "url": "my_students",
+                    "icon": "people",
+                    "validators": ["menu_generator.validators.is_authenticated"],
+                },
                 {
                     "name": _("Register absence"),
                     "url": "register_absence",
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html
new file mode 100644
index 000000000..c3f5e35d4
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html
@@ -0,0 +1,26 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load data_helpers %}
+{% load week_helpers %}
+{% load i18n %}
+
+{% block browser_title %}{% blocktrans %}My students{% endblocktrans %}{% endblock %}
+
+
+{% block page_title %}
+  {% blocktrans %}My students{% endblocktrans %}
+{% endblock %}
+
+{% block content %}
+  <div class="collection">
+    {% for person in persons %}
+      <a class="collection-item" href="{% url "overview_person" person.pk %}">
+      {{ person }}
+      </a>
+    {% empty %}
+      <li class="collection-item flow-text">
+        {% blocktrans %}No students available.{% endblocktrans %}
+      </li>
+    {% endfor %}
+  </div>
+{% endblock %}
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 2fc61a1c2..0482571bd 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -26,7 +26,8 @@ urlpatterns = [
     path(
         "print/group/<int:id_>", views.full_register_group, name="full_register_group"
     ),
-    path("person/<int:id_>/", views.overview_person, name="overview_person"),
+    path("persons/", views.my_students, name="my_students"),
+    path("persons/<int:id_>/", views.overview_person, name="overview_person"),
     path("me/", views.overview_person, name="overview_me"),
     path("absence/new", views.register_absence, name="register_absence"),
     path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index d07fae9ac..6c2dcba33 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -454,11 +454,23 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
     return render(request, "alsijil/print/full_register.html", context)
 
 
-def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
+def my_students(request: HttpRequest) -> HttpResponse:
     context = {}
-    person = objectgetter_optional(Person, default="request.user.person", default_eval=True)(
-        request, id_
+    relevant_groups = (
+        Group.objects.for_current_school_term_or_all()
+        .annotate(lessons_count=Count("lessons"))
+        .filter(lessons_count__gt=0, owners=request.user.person)
     )
+    persons = Person.objects.filter(member_of__in=relevant_groups)
+    context["persons"] = persons
+    return render(request, "alsijil/class_register/persons.html", context)
+
+
+def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
+    context = {}
+    person = objectgetter_optional(
+        Person, default="request.user.person", default_eval=True
+    )(request, id_)
     context["person"] = person
 
     if request.method == "POST":
@@ -554,11 +566,7 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
                 unexcused=Count("absent")
             )
         )
-        stat.update(
-            personal_notes.aggregate(
-                tardiness=Sum("late")
-            )
-        )
+        stat.update(personal_notes.aggregate(tardiness=Sum("late")))
 
         for extra_mark in ExtraMark.objects.all():
             stat.update(
-- 
GitLab