From c6cbb9d1c1b332cedb080f83cb8b419f1f99e427 Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Fri, 10 Jan 2025 20:11:31 +0100
Subject: [PATCH] Add graphql-backend for periods

---
 aleksis/apps/alsijil/schema/__init__.py | 35 +++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 284d8da2d..4be2322de 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -1,6 +1,8 @@
 from datetime import datetime
+from collections import defaultdict
 
 from django.db.models import BooleanField, ExpressionWrapper, Q
+from django.apps import apps
 
 import graphene
 import graphene_django_optimizer
@@ -52,6 +54,17 @@ from .personal_note import (
 from .statistics import StatisticsByPersonType
 
 
+class PeriodType(graphene.ObjectType):
+    period = graphene.Int()
+    time_start = graphene.Time()
+    time_end = graphene.Time()
+
+
+class WeekdayType(graphene.ObjectType):
+    weekday = graphene.Int()
+    periods = graphene.List(PeriodType)
+
+
 class Query(graphene.ObjectType):
     documentations_by_course_id = FilterOrderList(
         DocumentationType, course_id=graphene.ID(required=True)
@@ -99,6 +112,8 @@ class Query(graphene.ObjectType):
         group=graphene.ID(required=True),
     )
 
+    periods = graphene.List(WeekdayType)
+
     def resolve_documentations_by_course_id(root, info, course_id, **kwargs):
         documentations = Documentation.objects.filter(
             pk__in=Documentation.objects.filter(course_id=course_id)
@@ -346,6 +361,26 @@ class Query(graphene.ObjectType):
             annotate_person_statistics_for_school_term(members, school_term, group=group), info
         )
 
+    @staticmethod
+    def resolve_periods(root, info):
+        if apps.is_installed("aleksis.app.lesrooster"):
+            Slot = apps.get_model("lesrooster", "Slot")
+            ValidityRange = apps.get_model("lesrooster", "ValidityRange")
+            slots = Slot.objects.filter(time_grid__validity_range=ValidityRange.current).order_by("weekday").values("weekday", "period", "time_start", "time_end")
+            # Key by weekday
+            by_weekday = defaultdict(list)
+            for slot in slots:
+                # return nested dicts: {weekday periods { period time_* }}
+                # sort periods by period
+                by_weekday[slot["weekday"]].append(slot)
+            # Nest and sort periods
+            periods = []
+            for weekday, slots in by_weekday.items():
+                periods.append({"weekday": weekday, "periods": sorted(slots, key=lambda slot: slot["period"])})
+
+            return periods
+        else:
+            return []
 
 class Mutation(graphene.ObjectType):
     create_or_update_documentations = DocumentationBatchCreateOrUpdateMutation.Field()
-- 
GitLab