diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index e86bbed4c4d42a6f80de114f7815a79e52af6c20..7f91b90a2b763d77e7509b3a0e23792a4bb935e8 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 ccbfae70ae0d637d4e279c512a188e98b292e604..4452b3ba382d3253591891dffc2494830f19c2e9 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()