OpenT8 ist ein JSON-basiertes Datenformat zur Repräsentation von Stundenplandaten. Dieser Blog-Artikel ist eine Einführung in das Format und diskutiert die wesentlichen Aspekte von OpenT8.
Einführung
OpenT8 definiert ein generisches Standard-Datenformat zur Repräsentation von Stundenplandaten, unabhängig von ihrer Herkunft. Basierend auf dem JSON-Standard kann dieses Format mit nahezu jeder Programmiersprache leicht erzeugt und gelesen werden. Mit Hilfe des OpenT8 Document Schema können Dokumente im OpenT8-Format auf ihre syntaktische Korrektheit hin validiert werden.
OpenT8 kann zum Austausch von Stundenplandaten zwischen Diensten oder Anwendungen genutzt werden, als Quelle für die grafische Anzeige von Stundenplänen oder als Antwortformat für API-Anfragen (z.B. für RESTful Web-Services).
Stundenpläne und deren Komplexität
Wenn Kinder nach ihrem ersten Schultag nach Hause kommen und stolz ihren allerersten Stundenplan den Eltern präsentieren, dann ist die Welt eigentlich ganz einfach: Der Stundenplan der Klasse hat für jeden Tag der Woche eine Hand voll Unterrichtseinheiten, zeitlich justiert in einem vorgegeben Zeitraster (1. Stunde, 2. Stunde, etc.). Ein derartiger Plan ist wunderbar einfach, stellt aber leider nur die Idealsituation am Anfang des Schuljahres (in einer Grundschule) dar.
Bleiben wir für einen Moment bei dieser Grundschule und werfen ein Blick auf typische Abweichungen im Detail:
-
Stundenpläne sind bei genauerem Hinschauen nicht immer gleich für alle Schüler in einer Klasse. Ein Beispiel ist die Aufsplittung und Vermischung von Klassen für den Ethik- und Religionsunterricht.
-
Stundenpläne ändern sich in Laufe des Schuljahres dynamisch, weil Lehrkräfte erkranken, Räume nicht nutzbar sind, Klassenfahrten anstehen, Ufos gelandet sind usw.
-
Stundenpläne können neben klassischem Unterricht auch zusätzliche Termine, wie zum Beispiel Pausen, Hortzeiten oder auch einmalige Ereignisse (Schulfest, Sportfest, …), enthalten.
Ein Stundenplan ändert sich also im Laufe der Zeit (und muss diese Änderungen auch sichtbar machen), sollte parallele Unterrichtseinheiten verarbeiten können und im Idealfall auch unterrichtsfremde Ereignisse darstellen können, die oft zeitlich nicht kompatibel sind mit dem Standardzeitrahmen.
Und wenn wir jetzt auf weiterführende Schularten schauen, dann kommt noch sehr viel mehr dazu:
-
Stundenpläne in berufsbildenden Schulen sind Woche zu Woche unterschiedlich (z.B. A-Woche, B-Woche, …)
-
Stundenpläne in der gymnasialen Oberstufe sind individuell auf einzelne Schüler zugeschnitten, der Klassenverbund entfällt.
-
Hatten wir schon Schulferien und Feiertage erwähnt?
Die Liste ließe sich noch weiter fortführen. Im Prinzip geht es jedoch darum, ein Gefühl für die Komplexität von Stundenplänen zu vermitteln.
Stundenpläne und OpenT8
Wie kommt da jetzt OpenT8 ins Spiel? Nun, Stundenplandaten sind ein super wichtiger Bestandteil der digitalen Schulverwaltung. Egal ob Statistiken, digitale Klassenbücher, Notenverwaltung oder einfach nur die Antwort auf die Frage “Habe ich morgen um 8 Uhr Unterricht?”, immer sind es akkurate und aktuelle Stundenplandaten, welche die Grundvoraussetzung für eine weitere Verarbeitung sind. Ohne Stundenplandaten funktionieren viele Fachverfahren schlichtweg nicht.
Und jetzt kommen wir zum eigentlichen Problem: Stundenpläne werden durch eine Stundenplan-Software oder manuell erstellt und müssen dann mit weiteren Systemen synchronisiert werden. Allerdings gab es dafür bisher keinen Austauschstandard. Jede Software kocht da ihr eigenes Süppchen und stellt Daten in unterschiedlichsten Formaten via API oder Export zur Verfügung, oft unzureichend dokumentiert und manchmal auch noch unvollständig (z.B. keine Änderungsdaten). Von CSV, über XML und JSON bis hin zu direkten Datenbankzugriffen ist da alles dabei. Und das ist ja irgendwie blöd, denn die Daten gehören der Schule und sollten so einfach wie möglich nutzbar gemacht werden.
OpenT8 versucht dies zu ändern, indem es ein offenes, herstellerunabhängiges Datenformat definiert, das exakt spezifiziert, versioniert und ausführlich dokumentiert ist.
Ein Standard wie OpenT8 erlaubt das Entwickeln von Software-Schnittstellen, ohne zu wissen, wer der Konsument oder der Erzeuger der Stundenplandaten ist. Die Implementierung muss im Idealfall nur einmalig geschehen und spart somit für alle Beteiligten viel Aufwand und Nerven.
OpenT8 im Detail
In diesem Abschnitt wollen wir auf die wesentlichen Aspekte von OpenT8 näher eingehen:
- Ressourcen
- Kurse
- Planungselemente
- Zeitliche Ausdrücke
- Zeitrahmen
- Code-Listen
Ressourcen
Ein Stundenplan kann aus unterschiedlichen Perspektiven betrachtet werden. Es gibt Stundenpläne für Klassen, Schüler:innnen, Lehrkräfte, Räume und Aufsichtsbereiche. Dies sind, abstrakt gesehen, die Ressourcen eines Stundenplans.
OpenT8 definiert folgende Ressourcen:
-
Personen (persons): Personen sind Menschen, die eine bestimmte Rolle im Stundenplan spielen: Lehrkräfte, Erzieher:innen, Schüler:innen usw.
-
Gruppen (groups): Gruppen repräsentieren organisatorische Einheiten im Stundenplan: Klassen, Jahrgänge, Arbeitsgemeinschaften, Hortgruppen etc.
-
Räume (rooms): Räume definieren, wo Unterricht standfinden soll.
-
Aufsichtsbereiche (supervisionAreas): Aufsichtsbereiche definieren, wo eine Aufsicht stattfinden soll.
Kurse
Kurse (courses) bilden einen wesentlichen Kristallisationspunkt in OpenT8. Ein Kurs definiert, welches Fach von welcher Lehrer:in in welcher Gruppe oder für welche Schüler:innen unterrichtet werden soll. Mit Hilfe von zugeordneten Unterrichtseinheiten (Erklärung dazu kommt noch) kann ein Kurs zeitlich verplant werden.
Beispiel für einen Musikkurs in der 7. Klasse:
{
"id": "MU-7A",
"shortName": "MU",
"longName": "Musik",
"subject": {
"refId": "MU"
},
"groups": [
{
"refId": "7A"
}
],
"attendees": [
{
"refId": "Max",
"role": {
"refId": "LK"
}
}
]
}
Zeitliche Ausdrücke
Zeitliche Ausdrücke (temporal expressions) definieren, wann etwas geschieht. Zeitliche Ausdrücke sind von unterschiedlicher Ausprägung.
OpenT8 definiert die folgenden Typen:
-
Einmalig (oneTime): Ein einmaliger zeitlicher Ausdruck definiert einen einmalig stattfindenden Termin. Also, Startzeitpunkt und Endzeitpunkt, das war’s.
-
Wöchentlich (weekly): Ein wöchentlicher zeitlicher Ausdruck definiert einen wöchentlich wiederkehrenden Termin. Einzelne Wochen können dabei ausgenommen werden, um zusätzlich Wochenmuster (z.B. 14-tägig) zu definieren.
Der eigentliche Witz bei zeitlichen Ausdrücken ist jedoch, dass sie miteinander kombiniert werden können. Und zwar sowohl positiv (findet statt) als auch negativ (findet nicht statt). Es ist also beispielsweise möglich, eine einzelne Unterrichtseinheit (wie gesagt, Erklärung hierzu kommt gleich) wie folgt zu verplanen:
- Jeden Montag, nur an ungraden Wochen, von 8:00 bis 8:45, sowie jeden Mittwoch von 8:45-9:00 an geraden Wochen. Ausnahmsweise in der 11. Woche soll Mittwochs kein Unterricht stattfinden.
Beispiel für einen einmaligen Termin (7.4.2025 von 8:00 bis 8:45):
"temporalExpressions": [
{
"type": "onetime",
"startTimepoint": "2025-04-07T08:00:00+02:00",
"endTimepoint": "2025-04-07T08:45:00+02:00"
}
]
Beispiel für einen wöchentlichen Termin (Jeden Montags von 8:00 bis 8:45):
"temporalExpressions": [
{
"type": "weekly",
"startTimepoint": "2025-02-03T08:00:00+02:00",
"endTimepoint": "2025-02-03T08:45:00+02:00",
"validFrom": "2025-02-03T00:00:00+02:00",
"validTo": "2025-07-12T00:00:00+02:00"
}
]
Und jetzt unser Paradebeispiel von oben:
"temporalExpressions": [
{
"type": "weekly",
"startTimepoint": "2025-02-03T08:00:00+02:00",
"endTimepoint": "2025-02-03T08:45:00+02:00",
"weeks": [
"2025:6,8,10,12,14"
],
"validFrom": "2025-02-03T00:00:00+02:00",
"validTo": "2025-07-12T00:00:00+02:00"
},
{
"type": "weekly",
"startTimepoint": "2025-02-05T08:45:00+02:00",
"endTimepoint": "2025-02-05T09:30:00+02:00",
"weeks": [
"2025:7,9,11,13,15"
],
"validFrom": "2025-02-03T00:00:00+02:00",
"validTo": "2025-07-12T00:00:00+02:00"
},
{
"type": "onetime",
"startTimepoint": "2025-03-12T08:45:00+02:00",
"endTimepoint": "2025-03-12T09:30:00+02:00",
"operation": "exclude"
}
]
Planungselemente
Planungselemente (scheduled elements) sind die kleinen, sichtbaren Plättchen in einem Stundenplan. Plättchen ist aber nicht gleich Plättchen. So ein Plättchen hat ebenfalls unterschiedliche Ausprägungen.
OpenT8 definiert folgende Arten von Planungselementen:
-
Unterrichtseinheiten (lessons): Eine Unterrichtseinheit repräsentiert zeitlich geplanten Unterricht für einen definierten Kurs. Ein Kurs kann ein oder mehrere Unterrichtseinheiten besitzen.
Durch den Verweis auf den Kurs werden das unterrichtete Fach sowie zugeordnete Gruppen und Personen indirekt definiert. Ein Kurs kann jedoch selber nicht zeitlich verplant werden, das ist die Aufgabe der Unterrichtseinheiten. Hier werden die Zeiten, Räume und im Falle einer Abweichung vom Kurs optional auch Personen zugeordnet.
Beispiel für eine Unterrichtseinheit im obigen Musikkurs:
{ "type": "lesson", "id": "MU-7A-L", "course": { "refId": "MU-7A" }, "rooms": [ { "refId": "200" } ], "temporalExpressions": [ { "type": "weekly", "startTimepoint": "2025-02-05T11:00:00+02:00", "endTimepoint": "2025-02-05T11:45:00+02:00", "validFrom": "2025-02-03T00:00:00+02:00", "validTo": "2025-07-12T00:00:00+02:00" }, { "type": "weekly", "startTimepoint": "2023-02-07T12:20:00+02:00", "endTimepoint": "2023-02-07T13:05:00+02:00", "validFrom": "2025-02-03T00:00:00+02:00", "validTo": "2025-07-12T00:00:00+02:00" } ] }
-
Aktivitäten (activities): Aktivtäten sind Unterrichtseinheiten ohne Kurs. Es können Zeiten, Räume, Gruppen und Personen zugeordnet werden. Typische Beispiele sind Klassenfahrten, Dienstzeiten, Hortaufsichten, etc.
Beispiel für eine Hortaufsicht nach dem Unterricht:
{ "type": "activity", "id": "ho-23", "shortName": "HoAmAbend", "longName": "Hortaufsicht am Abend", "activityType": { "refId": "HA" }, "attendees": [ { "refId": "Eli", "role": { "refId": "ERZ" } } ], "rooms": [ { "refId": "200" } ], "temporalExpressions": [ { "type": "onetime", "startTimepoint": "2025-04-08T16:00:00+02:00", "endTimepoint": "2025-04-08T18:00:00+02:00" } ] }
-
Aufsichten (supervisions): Aufsichten repräsentieren Pausenaufsichten in den Zeiten zwischen dem Unterricht. Es können Zeiten, Aufsichtsbereiche und Personen zugeordnet werden.
Beispiel für eine Pausenaufsicht auf dem Schulhof:
{ "type": "supervision", "id": "aufsicht-1", "attendees": [ { "refId": "Leo", "role": { "refId": "ERZ" } } ], "areas": [ { "refId": "Hof-1" } ], "temporalExpressions": [ { "type": "weekly", "startTimepoint": "2023-02-05T09:30:00+02:00", "endTimepoint": "2023-02-05T09:45:00+02:00", "validFrom": "2025-02-03T00:00:00+02:00", "validTo": "2025-07-12T00:00:00+02:00" }, { "type": "weekly", "startTimepoint": "2023-02-06T09:30:00+02:00", "endTimepoint": "2023-02-06T09:45:00+02:00", "validFrom": "2025-02-03T00:00:00+02:00", "validTo": "2025-07-12T00:00:00+02:00" }, { "type": "weekly", "startTimepoint": "2023-02-07T09:30:00+02:00", "endTimepoint": "2023-02-07T09:45:00+02:00", "validFrom": "2025-02-03T00:00:00+02:00", "validTo": "2025-07-12T00:00:00+02:00" } ] }
-
Fehlstellen (gaps): Eine Fehlstelle kennzeichnet eine konkrete Unterrichtseinheit, eine Aktivität ode eine Aufsicht als nicht durchführbar wie ursprünglich geplant. Neben der Zeitangabe werden zunächst die Gründe festgehalten (z.B. Lehrer fehlt, Raum ist geschlossen, Klasse nicht da etc.), zu einem späteren Zeitpunkt auch die Auflösung der Fehlstelle (entweder Ausfall oder Ersatz).
Fehlstellen bilden den Kern der Repräsentation von Änderungen, seien es Unterrichtsausfälle, Zeitverschiebungen, Vertetungen oder Raumänderungen. Die eigentliche Änderung wird (mit Ausnahme des Ausfalls) wiederum durch eine passende Unterrichtseinheit, Aktivität oder Aufsicht repräsentiert. Diese unterscheidet sich vom Original je nach Kontext durch einen neuen Lehrer, einen neuen Raum und/oder eine neue Zeit.
Beispiel für eine Fehlstelle aufgrund eines fehlenden Lehrers:
{ "type": "gap", "id": "G-1", "appliesTo": { "type": "lesson", "refId": "MU-7A-L" }, "reasons": [ { "type": "absence", "appliesTo": { "type": "person", "refId": "Max" } } ], "resolutions": [ { "type": "substitution", "realisedBy": { "type": "lesson", "refId": "V-23" } } ], "temporalExpressions": [ { "type": "onetime", "startTimepoint": "2025-02-19T11:00:00+02:00", "endTimepoint": "2025-02-19T11:45:00+02:00" } ] }
-
Ereignisse (events): Ereignisse ähneln Aktivtäten, repräsentieren also keinen Unterricht, unterscheiden sich jedoch von Aktivtäten in einem wesentlichen Punkt: Eriegnise können nicht geändert bzw. vertreten werden. Daher sind Ereignisse gut geeignet für Termine, die unabhängig von einer bestimmten Personengruppe sind, also auf alle Fälle stattfinden, wie zum Beispiel Fortbildungen, Schulfeste, Sportfeste.
Beispiel für einen Abstimmungstermin zwischen zwei Lehrkräften:
{ "type": "event", "id": "meet-1", "shortName": "Meeting", "longName": "Abstimmung zur Einschulung", "eventType": { "refId": "KONFI" }, "attendees": [ { "refId": "Max", "role": { "refId": "LEH" } }, { "refId": "Eli", "role": { "refId": "LEH" } } ], "rooms": [ { "refId": "LeZi" } ], "temporalExpressions": [ { "type": "onetime", "startTimepoint": "2023-09-01T08:00:00+02:00", "endTimepoint": "2023-09-01T10:00:00+02:00" } ] }
-
Ferien (holidays): Ferien repräsentieren unterrichtsfreie Tage. OpenT8 unterscheidet zwischen Feiertagen und Schulferien.
Beispiel für Weihnachtsferien 2025/2026:
{ "type": "holiday", "id": "WeiFe", "shortName": "WeiFe", "longName": "Weihnachtsferien", "holidayType": "school", "temporalExpressions": [ { "type": "onetime", "startTimepoint": "2025-12-23T00:00:00+02:00", "endTimepoint": "2026-01-05T00:00:00+02:00" } ] }
-
Mitteilungen (announcements): Mitteilungen repräsentieren informelle Metaelemente im Stundenplan. Die Idee hierbei ist, den Stundenplan, auf den sowieso jeder draufschaut, auch als digitalen Aushang zu nutzen, indem künstliche Elemente mit einem Infotext ganztägig oder zu einem bestimmten Zeitpunkt angezeigt werden. Beispiele hierfür wären Hinweise auf akute Renovierungarbeiten, Streiks im öffentlichen Nahverkehr, ansteckende Krankheiten, Läuse etc.
Beispiel für Mitteilung bzgl. Feueralarm am 5.2.2025:
{ "type": "announcement", "id": "alarm-1", "shortDescription": "Feueralarm", "longDescription": "Heute Feueralarmübung in Gebaüde A", "temporalExpressions": [ { "type": "onetime", "startTimepoint": "2025-02-05T07:50:00+02:00", "endTimepoint": "2025-02-05T08:00:00+02:00" } ] }
Zeitrahmen
Stundenpläne sind in ihrer zeitlichen Darstellung eine Projektion der linerean Zeitachse eines Tages auf eine abstrakte Darstellung der Zeit in Form von Zeitfenstern. Jedes Zeitfenster repräsentiert dabei eine zeitliche Einheit von z.B. 45 min. Das macht einen Stundenplan lesbarer. Das Ganze ähnelt ein wenig der gängigen Abstraktion von Netzplänen im öffentlichen Nahverkehr.
In OpenT8 ist die Definition von Zeitrahmen (timeframes) getrennt von der Definition von zeitlichen Ausdrücken. Zeitliche Ausdrücke definieren konkrete Zeitpunkte, aber keine Hinweise darauf, ob es sich dabei um die 1. Stunde oder sonstwelche Stunde im Stundenplan handelt.
Erst durch die Abbildung von zeitlichen Ausdrücken auf einen Zeitrahmen kann eine grafische Darstellung im Zeitraster des Stundenplans erfolgen. Wie genau dies geschieht, obliegt dem konsumierenden System.
Beispiel für einen einfachen Zeitrahmen mit einem Zeitraster von fünf Stunden:
"timeFrames": [
{
"id": "default",
"shortName": "Unterricht",
"longName": "Unterrichtsraster",
"scopeOfWeek": [
"mon",
"tue",
"wed",
"thu",
"fri"
],
"timeSlots": [
{
"shortLabel": "1",
"longLabel": "1. Stunde",
"startTime": "08:00:00Z",
"endTime": "08:45:00Z"
},
{
"shortLabel": "2",
"longLabel": "2. Stunde",
"startTime": "09:05:00Z",
"endTime": "09:50:00Z"
},
{
"shortLabel": "3",
"longLabel": "3. Stunde",
"startTime": "10:10:00Z",
"endTime": "10:55:00Z"
},
{
"shortLabel": "4",
"longLabel": "4. Stunde",
"startTime": "11:00:00Z",
"endTime": "11:45:00Z"
},
{
"shortLabel": "5",
"longLabel": "5. Stunde",
"startTime": "12:20:00Z",
"endTime": "13:05:00Z"
}
]
}
]
Code-Listen
Wir haben gelernt, dass eine Gruppe beispielsweise eine Klasse, einen Oberstufenjahrgang oder auch eine Hortgruppe repräsentieren kann. Aber woher weiß ich das denn so genau? Als Mensch kann ich die Information in der Regel vom Gruppennamen ableiten, aber eine Software steht erstmal dumm da.
Nun besitzt jede Gruppe in OpenT8 die Eigenschaft groupType
mit welcher die Art der Gruppe definiert werden kann. Schön, aber das beantwortet immer noch nicht die Frage. Auch in der Liste der Gruppentypen kann alles Mögliche stehen, eine Software wäre immer noch verwirrt.
Wäre es nicht toll, wenn wir für dieses Problem auch einen - Trommelwirbel - Standard hätten?
Ja genau. Aus diesem Grund unterstützt OpenT8 auch den Standard OpenCodeList, ein standardisiertes JSON-Format zum Repräsentieren von Code-Listen bzw. Schlüsselverzeichnissen. Konkret bedeutet dies für unser Beispiel, dass Gruppentypen mit einem OpenCodeList-kompatiblen Standard-Code versehen werden können. Dieser definiert nicht nur eine eindeutige Klassifizierung, sondern auch deren Herkunft. Im Falle von Gruppentypen wäre das:
https://api.codelisthub.org/v1/documents/urn:opene8:school:codelist:de:groupType:v1
Neben Gruppentypen können OpenCodeList-kompatible Standard-Codes auch an vielen anderen Stellen definiert werden (im Detail siehe OpenT8-Spezifikation).
Beispiel für einen Gruppentyp mit dem OpenCodeList-Code “KLA” für Klasse:
"groupTypes": [
{
"id": "KL",
"shortName": "KL",
"longName": "Klasse",
"code": {
"codeListRef": {
"canonicalUri": "urn:opene8:school:codelist:de:groupType",
"locationUrls": [
"https://api.codelisthub.org/v1/documents/urn%3Aopene8%3Aschool%3Acodelist%3Ade%3AgroupType"
]
},
"keyId": "key",
"value": "KLA"
}
}
]
Diskussion
IDs
Die meisten Entitäten in OpenT8 müssen durch eine ID eindeutig identifiziert werden. OpenT8 gibt ledglich vor, dass es sich bei einer ID um einen JSON-String handeln muss. Dessen Semantik bleibt dem generierenden System überlassen.
Folgende ID-Semantiken bieten sich an:
-
GUID: Eine GUID (Globally Unique Identifier) ist ein weltweit eindeutiger Identifikator, der verwendet wird, um Objekte, Datensätze oder Ressourcen eindeutig zu kennzeichnen – ohne dass eine zentrale Koordinierungsstelle nötig ist.
Eine GUID ist ein 128-Bit-Wert, der üblicherweise in einem standardisierten Format als Zeichenkette dargestellt wird, zum Beispiel:
550e8400-e29b-41d4-a716-446655440000
GUIDs sind global eindeutig.
-
Datenbank-IDs: Die meisten Datenbanken bieten Support für eine sich laufend erhöhende Nummer, die als Primärindex genutzt wird. Der Nachteil solcher IDs ist, dass sie nur im Kontext des generierenden Dientes eindeutig sind.
-
URI-basierte IDs: Kombiniert man Datenbank-IDs mit einer URI, dann hätte man wiederum global eindeutige IDs (ähnliches Prinzip wie bei Code-Listen im OpenCodeList-Format). Der Nachteil solcher IDs ist, dass sie in der Regel nicht kompakt im aufnehmenden System gespeichert werden können.
Die Empfehlung geht also klar Richtung GUID/UUID.
Hierarchien
Einem Kurs wurde die Klasse 7A als Gruppe zugewiesen. Das bedeutet, auch alle Schüler in dieser Klasse sind (indirekt) diesem Kurs zugewiesen.
Was aber, wenn nur die Hälfte der Klasse den Kurs besuchen soll? In diesem Fall weise ich die relevanten Schüler als Personen zu und lösche den Verweis auf die Klasse 7A. Und was ist, wenn ich den Klassenverweis behalten möchte, weil er für mich wichtig ist? In diesem Fall haben wir einen kleinen Konflikt.
OpenT8 legt nicht explizit fest, wie Gruppen- und Personenzuordnungen zu interpretieren sind. Es wird aber folgende Praxis empfohlen:
Für ein Kurs gilt:
-
Sind Schüler explizit einem Kurs zugeordnet, dann sind dies die Schüler des Kurses, egal ob zusätzlich Klassen zugeordnet sind.
-
Sind keine Schüler explizit einem Kurs zugeordnet, dann sind die Schüler der zugeordneten Klassen deckungsgleich mit den Schülern des Kurses.
Für die Unterrichtseinheiten eines Kurses gilt:
-
Sind Schüler explizit einer Unterrichtseinheit zugeordnet, dann sind dies die Schüler der Unterrichtseinheit, egal ob zusätzlich Klassen zugeordnet sind und egal was im Kurs definiert ist.
-
Sind Schüler nicht explizit einer Unterrichtseinheit zugeordnet, dann sind die Schüler der zugeordneten Klassen deckungsgleich mit der Unterrichtseinheit, egal was im Kurs definiert ist.
-
Sind weder Schüler noch Klassen einer Unterrichtseinheit zugeordnet, dann gilt, was im Kurs definiert ist.
Dieses Prinzip lässt sich auch auf Aktivitäten und Ereignisse sowie auf Lehrerzuordnungen in Kursen/Unterrichtseinheiten übertragen.
Zum Schluss
Klingt gut? Finden wir auch. Deshalb hier noch einmal der Verweis auf die komplette Spezifikation:
Wir freuen uns über Feedback.