From 21863194310cfa019b88533b68b1241b0042db2b Mon Sep 17 00:00:00 2001 From: Julian Leucker <leuckerj@gmail.com> Date: Wed, 17 Jan 2024 01:15:11 +0100 Subject: [PATCH] Create endpoint for real and dummy documentations in a timeframe --- aleksis/apps/alsijil/models.py | 35 ++++++++++++++++++++++++- aleksis/apps/alsijil/schema/__init__.py | 14 ++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index e86bbed4c..7f91b90a2 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -1,11 +1,13 @@ -from datetime import date +from datetime import date, datetime from typing import Optional, Union from urllib.parse import urlparse +import json from django.db import models from django.db.models import QuerySet from django.db.models.constraints import CheckConstraint from django.db.models.query_utils import Q +from django.http import HttpRequest from django.urls import reverse from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ @@ -513,6 +515,37 @@ class Documentation(CalendarEvent): ), ] + @classmethod + def get_for_coursebook(cls, obj_type: str, obj_id: str, date_start: datetime, date_end: datetime, request: HttpRequest) -> list: + """Get all the documentations for an object and a time frame. + + obj_type may be one of TEACHER, GROUP, ROOM, COURSE + """ + + # 1. Find all LessonEvents for all Lessons of this Course in this date range + # TODO: verify that substitutions don't break this + events = LessonEvent.get_single_events(date_start, date_end, request, {"type": obj_type, "id": obj_id, }, with_reference_obj=True) + # (1.5 filter them by permissions) + ... + + # 2. For each lessonEvent → check if there is a documentation + # if so, add the documentation to a list, if not, create a new one + return [ + ( + event_reference_obj.documentation.first() # TODO: probably show all documentations + if (event_reference_obj := event["REFERENCE_OBJ"]).documentation.exists() else + cls( + pk=f"DUMMY:{event_reference_obj.id}", + lesson_event=event_reference_obj, + course=event_reference_obj.course, + subject=event_reference_obj.subject, + datetime_start=event["DTSTART"].dt, + datetime_end=event["DTEND"].dt, + ) + ) + for event in events + ] + class ParticipationStatus(ExtensibleModel): """A participation or absence record about a single person. diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py index ccbfae70a..4452b3ba3 100644 --- a/aleksis/apps/alsijil/schema/__init__.py +++ b/aleksis/apps/alsijil/schema/__init__.py @@ -1,5 +1,6 @@ from django.db.models.query_utils import Q +from datetime import datetime import graphene from aleksis.core.schema.base import FilterOrderList @@ -19,6 +20,12 @@ class Query(graphene.ObjectType): documentations_by_course_id = FilterOrderList( DocumentationType, course_id=graphene.ID(required=True) ) + documentations_for_coursebook = FilterOrderList( + DocumentationType, + course_id = graphene.ID(required=True), + date_start=graphene.Date(required=True), + date_end=graphene.Date(required=True), + ) def resolve_documentations_by_course_id(root, info, course_id, **kwargs): documentations = Documentation.objects.filter( @@ -26,6 +33,13 @@ class Query(graphene.ObjectType): ) return documentations + def resolve_documentations_for_coursebook(root, info, course_id, date_start, date_end, **kwargs): + datetime_start = datetime.combine(date_start, datetime.min.time()) + datetime_end = datetime.combine(date_end, datetime.max.time()) + + # TODO: later on, allow getting documentations for other types than courses, e.g. groups or persons + return Documentation.get_for_coursebook("COURSE", course_id, datetime_start, datetime_end, info.context) + class Mutation(graphene.ObjectType): create_documentation = DocumentationCreateMutation.Field() -- GitLab