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