Normalerweise konfigurieren Sie die Inhalte Ihrer Kursumgebungen im Online-Übungssystem direkt online über die Webschnittstelle, d.h. Sie loggen sich im Betreuerzugang Ihres Übungssystem-Kurses ein, können dort bestehende Aufgabenhefte einsehen, neue Hefte hinzufügen, Einstellungen zu Heften ändern (z.B. Bearbeitungszeiträume festlegen, Benotung aktivieren, dazu ggf. ein Notenschema festlegen u.v.m.), sowie natürlich Aufgaben erzeugen und bearbeiten.
Aufgabeneinrichtungen bestehen zum Teil aus HTML-Dateien, sog. Standard-Kursressourcen, wie z.B. aufgabe1.1.html
für das Aufgabenformular zur ersten Aufgabe des ersten Hefts. Wenn Sie die Aufgabenerstellungsassistenten verwenden, werden diese Standard-Kursressourcen für Sie automatisch erzeugt, bei der fortgeschrittenen Aufgabenerstellung erstellen Sie diese selbst (oder passen von Assistenten erzeugten Ressourcen nachträglich an). Letzteres kann offline passieren:
Nun bestehen Aufgabeneinrichtungen nicht nur aus diesen Standard-Kursressourcen: In der fortgeschrittenen Aufgabenerstellung finden Sie auch noch einige Eingabefelder wie den Aufgabennamen, erreichbare Punktzahlen pro Teilaufgabe sowie Möglichkeiten zum Einbinden und Konfigurieren von (Vor-)Korrekturmodulen. (Wenn Sie die Aufgabenerstellungsassistenten verwenden, werden auch diese Einstellungen vom Assistenten erzeugt und müssen nicht direkt von Ihnen bearbeitet werden.)
Um auch solche Aufgaben-Einstellungen ebenso wie die Aufgabenheft-Einstellungen (s.o.) offline bearbeiten und später ins Übungssystem importieren zu können, unterstützt das Online-Übungssystem nun das Hochladen einer entsprechenden Konfigurationsdatei. Durch den Upload einer einzigen Konfigurationsdatei können Sie also alle Aufgabenhefte (samt Notenschemata etc.) und Aufgaben in einem Schritt konfigurieren. Das Hochladen erfolgt ebenfalls über die Kursressourcen-Upload-Funktion: Wird dort im Upload eine solche Konfigurationsdatei (an ihrem Dateinamen) erkannt, so wird diese nicht als Kursressource gespeichert, sondern ihre Einstellungen werden in die bestehenden Aufgabenhefte und Aufgaben importiert.
Und auch der Download des ZIP-Files mit allen Kursressourcen enthält (seit Ende Juli 2019) eine solche Konfigurationsdatei, die den aktuellen Stand aller Aufgabenheft- und Aufgabeneinstellungen zum Downloadzeitpunkt umfasst.
Auf diese Weise ist z.B. eine Migration von Aufgaben von einem Kurs in einen anderen, neuen Kurs möglich: Laden Sie vom Quellkurs das Kursressourcen-ZIP herunter und laden dies in einem neuen (leeren) Kurs wieder hoch, so werden daraus zunächst alle Kursressourcen importiert, zu allen gefundenen Standardkursressourcen die entsprechend benötigten Aufgabenhefte und Aufgaben abgeleitet und erzeugt und diese anschließend mit den Einstellungen aus der Konfigurationsdatei konfiguriert.
Es kann auch sinnvoll sein, vor Änderungen an Ihren Aufgaben ein solches Kursressourcen-ZIP als Backup herunterzuladen.
Aber auch, falls Sie manuell offline Konfigurationsänderungen vornehmen möchten, können Sie dazu das Kursressourcen-ZIP herunterladen, entpacken, die Konfigurationsdatei daraus entnehmen und diese als Vorlage für Ihre Änderungen verwenden, sie also bearbeiten und nach der Bearbeitung wieder hochladen.
Damit beim Kursressourcen-Upload eine hochgeladene Datei als Konfigurationsdatei erkannt und ausgewertet (statt als Kursressource gespeichert) wird, muss sie einen bestimmten Namen haben, der wie folgt aufgebaut ist:
config-12345-WS20.json
Dabei ist 12345
durch die (fünfstellige) Kursnummer zu ersetzen, und WS20
durch die jeweilige Semesterkennung, also SS
oder WS
gefolgt von zweistelliger Jahreszahl. (Die Groß-/Kleinschreibung von hochgeladenen Dateien wird dabei ignoriert.)
Beachten Sie insbesondere beim Upload, dass in der Regel der im Dateinamen genannte Kurs ebenso wie die Semesterkennung „zum Zielkurs passen“ müssen. Das verhindert insbesondere, dass Sie z.B. eine Konfigurationsdatei mit Bearbeitungsterminen für ein geplantes Semester versehentlich in die Kursumgebung fürs Vorsemester hochladen und dort rückwirkend alle Termine verstellen. Lediglich wenn der Zielkurs, in den Sie hochladen, noch „leer“ ist (noch keine Aufgaben enthält), wird eine hochgeladene Konfigurationsdatei auch dann verarbeitet, wenn ihr Name nicht zum Kurs passt. Dabei kann erstens kein Schaden entstehen (weil ja im leeren Kurs noch keine Einstellungen existieren, die dadurch überschrieben würden), und zweitens ermöglicht das den oben beschriebenen einfachen Weg des Kopierens von Aufgaben eines Kurses in eine neue leere Kursumgebung (ohne, dass erst das ZIP entpackt und die Konfigurationsdatei darin passend zum Zielkurs umbenannt werden muss)1.
Als Dateiformat für die Konfigurationsdatei kommt das JSON-Format (JavaScript Object Notation) zum Einsatz, da es relativ gut manuell in Texteditoren les- und editierbar ist. Als Datei-Encoding ist (wie bei JSON üblich) UTF-8
zu verwenden. Der genaue Aufbau (des Inhalts) der JSON-Dateien wird im nachfolgenden Kapitel dokumentiert.
Der Umfang einer hochzuladenden Datei ist variabel. Das soll heißen: Eine Datei gilt nicht als unvollständig oder defekt, wenn mögliche Angaben darin fehlen. Vielmehr werden beim Upload eben alle in der Datei vorhandenen Einstellungen importiert, und alle Einstellungen im Kurs, zu denen sich keine Einträge in einer hochgeladenen JSON-Datei finden, bleiben einfach unverändert (da werden also auch keine Einstellungen gelöscht).
So können Sie z.B. eine Konfigurationsdatei ausschließlich mit den Bearbeitungsterminen aller Aufgabenhefte für ein Zielsemester füllen und hochladen. Damit werden dann eben genau diese Termine im Kurs eingetragen und alle anderen Einstellungen unangetastet gelassen. Oder wenn Ihr Kurs z.B. zwar vier Aufgabenhefte enthält, Ihre JSON-Datei aber nur Einstellungen zu den Heften Nr. 1 und 3 enthält, dann werden eben diese Hefte dadurch bearbeitet und die Hefte 2 und 4 bleiben unverändert.
Die im Download aller Kursressourcen (als ZIP) enthaltene JSON-Datei ist dagegen i.d.R. „vollständig“, enthält also alle im JSON-Format abbildbaren Einstellungen der im Kurs vorliegenden Hefte und Aufgaben. Ungenutzte Einstellungen werden dabei allerdings nicht exportiert; für ein Aufgabenheft, zu dem keine Benotung eingestellt ist, wird im JSON z.B. nur notiert, dass die Benotung deaktiviert ist, es wird aber kein Notenschema mit exportiert – auch kein leeres (die exportierte Datei wäre in diesem Zustand also nicht als Vorlage für die Offline-Erstellung eines Notenschemas geeignet).
aufgabenhefte
-PropertyDas JSON-Dokument besteht zunächst aus einem JSON-Objekt, beginnt also mit {
, endet mit }
, und dazwischen können Einstellungen stehen. Derzeit unterstützt dieses Format ausschließlich den Im- und Export von Aufgabenheften (mit Aufgaben, Notenschema etc. als Kindelementen). Dazu ist in dem Root-Objekt eine Property mit Key "aufgabenhefte"
(als derzeit einzige Property2) einzufügen. Der Value (Wert) dieser Property ist eine Aufzählung von Aufgabenheften, für die Sie Einstellungen in der Datei sammeln möchten. Diese kann wahlweise als JSON-Array angegeben werden (dann bezieht sich das erste Array-Element auf Aufgabenheft Nr. 1, das zweite auf Heft 2 etc.) oder als Objekt mit Aufgabenheft-Nummern als Keys. Der Value dazu ist in jedem Fall wieder ein JSON-Object (also eine mit Mengenklammern eingefasste Aufzählung von Properties der Form "key": value
) mit Einstellungen zum Aufgabenheft.
Beispiel 1.1 mit JSON-Array:
{"aufgabenhefte": [
{
"name": "Mein erstes Heft",
"bearbeitungsbeginn": "01.04.2018, 00:00",
"bearbeitungsende": "14.04.2018, 24:00"
},
{ "name": "Mein zweites Heft",
"bearbeitungsbeginn": "07.04.2018, 00:00",
"bearbeitungsende": "21.04.2018, 24:00"
}
]}
Beispiel 1.2 mit JSON-Object:
{"aufgabenhefte": {
"1": {
"name": "Mein erstes Heft",
"bearbeitungsbeginn": "01.04.2018, 00:00",
"bearbeitungsende": "14.04.2018, 24:00"
},
"2": {
"name": "Mein zweites Heft",
"bearbeitungsbeginn": "07.04.2018, 00:00",
"bearbeitungsende": "21.04.2018, 24:00"
}
}}
Im Zweifel empfehlen wir die zweite Variante (Objects mit vorangestellter Aufgabenheftnummer), da sie folgende Vorteile aufweist:
Die drei Properties name
, bearbeitungsbeginn
und bearbeitungsende
aus obigen Beispiellistungs sind nur eine beispielhafte Auswahl möglicher Aufgabenheft-Properties. Der nächste Abschnitt erläutert sämtliche möglichen Aufgabenheft-Properties.
Für jedes Aufgabenheft-Objekt (siehe vorigen Abschnitt) können die Aufgabenheft-Einstellungen über die folgenden Properties angegeben werden. Zur Bedeutung der einzelnen Einstellungen lesen Sie bitte die Online-Hilfe zu den entsprechenden Eingabefeldern in der Benutzeroberfläche (Aufgabenheftverwaltung).
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
name |
String | Optionaler Name fürs Aufgabenheft. Leerstring ("" ) für unbenanntes Heft: Anders als wenn Sie diese Property ganz weglassen, wird bei Angabe von "name":"" dafür gesorgt, dass das Heft anschließend unbenannt ist, ein ggf. im System noch vorhandener Name also gelöscht wird. |
bearbeitungsbeginn |
String | Datum und Uhrzeit des Bearbeitungsbeginns in der Form tt.mm.jjjj, hh:mm |
bearbeitungsende |
String | Datum und Uhrzeit des Bearbeitungsendes in der Form tt.mm.jjjj, hh:mm |
korrekturfreigabe |
String | entweder "VOR_BEARBEITUNGSENDE_ERLAUBT" oder "ERST_NACH_BEARBEITUNGSENDE" |
autokorrektur-autofreigabe |
String | entweder "KEINE" , "NUR_AUTO" oder "AUCH_AUTOHAND" – legt fest, ob Autokorrekturen (ggf. auch solche zu Aufgaben der Korrekturart „automatisch und von Hand“ mit voller Punktzahl bewertete) sofort beim Heft-Schließen den Korrekturstatus „freigegeben“ bekommen sollen. (Nicht verfügbar für Prüfungshefte, s.u.) |
handkorrektur-autofreigabe |
String | entweder KEINE , EINZELFREIGABE , HEFTFREIGABE oder KOMPLETTFREIGABE – legt fest, ob Korrekturen zu handbewerteten Aufgaben, die normalerweise von einem Betreuer von Hand freigegeben werden müssten, automatisch freigegeben werden sollen. (Bei Prüfungsheften gilt diese Einstellung für alle Korrekturen einschließlich Autokorrekturen.) |
heftoeffnenoption |
String | KEINE , EINSENDUNGEN_BEHALTEN oder EINSENDUNGEN_LOESCHEN – Einstellung nur für Selbstkontrollarbeits-Hefte, die ausschließlich autokorrigierte Aufgaben enthalten, welche auch nicht sofort bei Einsendung ein Sofortfeedback geben, sondern erst nach Heftschließen. Für diese Hefte kann hier ein Heft-Öffnen zum erneuten Bearbeiten der Selbstkontrollarbeit ermöglicht werden. |
aufgaben |
Object oder Array | siehe aufgaben -Property von Aufgabenheft |
aufgabenbloecke |
Array | siehe aufgabenbloecke -Property von Aufgabenheft |
Die heftglobale Aufgaben-Randomisierung wird über die folgenden Properties konfiguriert:
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
shuffle |
Boolean | true für individuelle Zufallsreihenfolge, Default: false |
random-selection |
Integer | Für Zufallsauswahl von n Aufgaben(blöcken) ist hier der Wert n (> 0) einzutragen. Default ist 0, was für Anzeige immer aller Aufgaben ohne Zufallsauswahl steht. |
random-von |
Integer | Kann optional den Beginn des Randomisierungsbereichs (für shuffle bzw. random-selection ) festlegen, genauer die Nummer der ersten Aufgabe des Randomisierungsbereichs. Alle Aufgaben mit kleinerer Nummer sind dann fixiert/„angepinnt“, also von der Randomisierung ausgeschlossen. Bei fehlender Angabe sind keine Aufgaben fixiert, der Randomisierungsbereich beginnt dann ab der ersten Aufgabe. |
random-bis |
Integer | Analog optional Ende des Randomisierungsbereichs (Nummer der letzten Aufgabe), alle Aufgaben mit größerer Nummer sind dann fixiert. |
random-link-access-required |
Boolean | Wird nur berücksichtigt, wenn zwar eine Zufallsreihenfolge shuffle (hier oder auf Blockebene) aktiviert ist, aber keine Zufallsauswahl random-selection (weder hier noch auf Blockebene). Dann kann hierüber gesteuert werden, ob Direktlinks zu Aufgaben mit absoluten Aufgabennummern unterstützt werden (false ) oder ob – wie implizit immer bei random-selection – Studierende Aufgaben nur noch über die speziellen Random-Links zugreifen dürfen, in denen statt der absoluten Aufgabennummer ihre individuelle Aufgabennummer nach Randomisierung kodiert ist. Siehe Hilfetext in Aufgabenheft-Einstellungen für mehr Details. |
shuffleVon |
Integer | Alter Name von random-von aus der Zeit, als nur shuffle , aber keine random-selection möglich war. Wird nicht mehr exportiert, bei Importen aber noch als Alias unterstützt. |
shuffleBis |
Integer | Alter Name von random-bis . |
Dazu kommen ggf. noch blocklokale Randomisierungseinstellungen, die dann in den jeweiligen Aufgabenblock-Properties eingestellt werden können.
Die folgenden Einstellungen stehen nicht für alle Kurse im Online-Übungssystem zur Verfügung, sondern nur in speziellen Sonderfällen. (Prüfen Sie im Zweifel in Ihrem Kurs, ob die entsprechenden Einstellungen in der Benutzeroberfläche, also der Aufgabenheftverwaltung, von Ihnen gesetzt bzw. eingesehen werden können. Einstellungen, die Sie online nicht einstellen können, können Sie auch nicht per JSON konfigurieren, die JSON-Properties werden dann ignoriert.)
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
nur-individuelle-termine |
Boolean | Nur für Prüfungen: Wenn true , können Sie zum Aufgabenheft keine Bearbeitungsbeginn- und -Ende-Termine mehr global festlegen. Vielmehr können nur Studierende die Aufgaben bearbeiten, die zur zugeordneten Prüfung (siehe pruefungsnr ) angemeldet sind und zu deren Anmeldung ein individueller Bearbeitungszeitraum in der Prüfungsverwaltung festgelegt wurde. |
bearbeitungsende-vz |
String | Nur für Prüfungen, für die zwei verschiedene Einsendefristen festgelegt werden können: Dies ist dann der Einsendeschluss für Vollzeitstudenten, bearbeitungsende (s.o.) legt dann den Termin für alle anderen Hörerstatus fest. Format wie bei bearbeitungsende . |
bestehensgrenze |
Integer oder String | Nur für Kurse mit Punktzahl-Export zu Einsendearbeiten oder Selbstkontrollarbeiten nach SLO: Eine Zahl gibt eine Grenze in Prozentpunkten an, ab der eine Einsendearbeit als bestanden gilt. Ein Leerstring-Literal ("" ) wählt explizit die Standardeinstellung (derzeit 50%). |
pruefungsnr |
Integer | Nur für Prüfungen: Prüfungsnummer. Zahl 0 für explizite Angabe, dass keine Prüfungsnummer zugeordnet werden soll (und eine ggf. vorhandene zu löschen ist). |
pruefungsfachbereich |
String | Nur bei Prüfungen der Fakultät M+I. Sollte hier ein Lehrgebiet der Mathematik eine Prüfungsnummer der Informatik eintragen wollen (oder umgekehrt), ist der entsprechende abweichende Fachbereich INF bzw. MATHE anzugeben. |
probepruefung |
Boolean | true für Probeprüfungen (Anmeldungen auswerten, aber kein Prüfungsergebnis nach POS exportieren) |
pruefungs-schluessel |
Integer | Nur für bestimmte Prüfungen, zu denen keine Anmeldungen erwartet werden. Zahl 0 löscht explizit bestehende Schlüssel. |
prueferid |
String | Nur für bestimmte Prüfungen (wenn dem Kurs-Veranstalter nicht bereits eine Prüfer-ID fest zugeordnet ist): Prüfer-ID / Prüferkürzel für das Aufgabenheft |
Für die meisten Kurse lässt sich optional eine Benotung zum Aufgabenheft einstellen:
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
benotung |
String | Nur für Kurse, die eine Benotung unterstützen (Regelfall): Entweder "KEINE" , "PRO_AUFGABE" oder "PER_SCHEMA" |
notenspiegel |
Boolean | Falls unter benotung nicht KEINE eingestellt ist, steuern Sie hiermit, ob Studenten nach Korrekturfreigabe den Notenspiegel einsehen dürfen (true ) oder nicht (false ). |
normalisierung |
Object oder Array | Nur falls "benotung":"PER_SCHEMA" eingestellt ist: Notenschema-Normalisierungseinstellungen, s.u. |
notenschema |
Object | Nur falls "benotung":"PER_SCHEMA" eingestellt ist: Notenschema, s.u. |
benotung-abwertung |
Object | Nur für Hefte mit mehr als einer Aufgabe und "benotung": "PRO_AUFGABE" . Legt Mindest-Bestehenskriterium fest, bei dessen Verletzung immer eine 5,0 vergeben wird. Siehe folgenden Unterabschnitt |
benotung-abwertung
Das dort anzugebende Object hat mindestens die Property modus
und optional zusätzlich die aufgabenzahl
:
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
modus |
String | NONE (keine Abwertung), REQUIRE_PASSED (jede Einzelnote muss bestanden / besser als 5,0 sein) oder MAJORITY_5 (Abwertung zu 5,0, wenn die Mehrheit der Einzelnoten eine 5 ist). |
aufgabenzahl |
Integer | Optionale Angabe zur Einschränkung des Modus. Bei REQUIRE_PASSED die maximal erlaubte Anzahl nicht bestandener Aufgaben (Default: 0), bei MAJORITY_5 die maximal erlaubte Anzahl unbearbeiteter bzw. nicht bewerteter Aufgaben (Default: Maximum). |
Auch hier finden Sie in der Online-Hilfe zu den Aufgabenheft-Einstellungen ausführlichere Beschreibungen der Modi.
Wie in der Online-Maske zur Erfassung eines Notenschemas auch, haben Sie hier folgende Normalisierungsmöglichkeiten zur Auswahl:
Details zur Normalisierung werden an dieser Stelle nicht erläutert, lesen Sie im Zweifel die Online-Hilfe im Notenschema-Editor der Aufgabenheftverwaltung. (Wenn Sie die Einstellungen per JSON-Import vornehmen möchten, gehen wir davon aus, dass Sie deren Bedeutung bereits kennen.)
ad 1. (Lotse-Normalisierung)
Im ersten Fall muss der Value der normalisierung
-Property ein JSON-Object sein, das wiederum selbst folgende Properties haben darf:
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
bonusNormalpunkte |
Integer | Punktzahl, die nach Multiplikation der Rohpunkte mit der Steigung zu addieren ist. |
bonusRohpunkte |
Integer | Punktzahl, die zu den Rohpunkten vor Multiplikation mit der Steigung zu addieren ist. |
steigung |
Fließkommazahl oder String | Faktor, mit dem die Rohpunkte (ggf. nach Addition von bonusRohpunkte ) zu multiplizieren sind. Oder Leerstring-Literal ("" ) für die explizite Festlegung, dass keine Steigung konfiguriert werden soll (also die Steigung der Prozentpunkte-Funktion zu verwenden ist). (Wenn Sie die Property steigung gar nicht angeben, bleibt beim JSON-Import die Steigungs-Einstellung unverändert, während bei Angabe von "" eine ggf. gespeicherte Steigung gelöscht wird.) |
rohpunkte |
Boolean | false (Die Angabe dieser Property ist optional, aber wenn sie angegeben wird, ist ihr Wert auf false einzustellen, um die Normalisierung zu aktivieren. Der Wert true deaktiviert die Normalisierung, siehe ad 3..)) |
Beispiel 2.1 (Lotse-Normalisierung):
{"aufgabenhefte": {
…
"2": {
…
"benotung": "PER_SCHEMA",
"notenspiegel": true,
"normalisierung": {
"bonusNormalpunkte": -10,
"bonusRohpunkte": 0,
"steigung": 7.333333333333333
},
"notenschema": …
}
}}
ad 2. (Kontrollpunkt-Normalisierung)
Für eine Kontrollpunkt-Normalisierung muss der Value der normalisierung
-Property dagegen ein JSON-Array mit den einzelnen Kontrollpunkten sein. Jeder Eintrag dieses Arrays, also jeder Kontrollpunkt, ist wiederum als JSON-Array mit genau zwei Elementen anzugeben, von denen das erste Element die Prozentpunktzahl ist (als Fließkommazahl), der eine bestimmte Normalpunktzahl (Ganzzahl/Integer) zuzuordnen ist. Diese Normalpunktzahl wird als zweiter Wert ins Kontrollpunkt-Array geschrieben.
Beispiel 2.2 (Kontrollpunkt-Normalisierung):
Das folgende Beispiel legt eine Normalisierung über die folgenden drei Kontrollpunkte (10; 0), (50; 50) und (75,88; 90) fest:
{"aufgabenhefte": {
…
"3": {
…
"benotung": "PER_SCHEMA",
"notenspiegel": false,
"normalisierung": [
[10, 0],
[50, 50],
[75.88, 90]
],
"notenschema": …
}
}}
Eine entsprechende Normalisierungseinstellung (z.B. nach Import des obigen Fragments) sähe in der Weboberfläche wie folgt aus:
ad 3. (Normalisierung deaktivieren)
In diesem Fall muss der Wert der normalisierung
-Property ein JSON-Object sein, das seinerseits die (oben unter ad 1. bereits eingeführte) Boolean-Property rohpunkte
auf true
setzt:
"normalisierung": {"rohpunkte": true}
Standard-Normalisierung (Prozentpunkte auf Noten abbilden)
Die Standardeinstellung für Notenschema-Normalisierung liegt vor, wenn im Aufgabenheft weder Bonuspunkte oder Steigung noch Normalisierungskontrollpunkte angegeben wurden noch die Normalisierung explizit abgeschaltet wurde. In dem Fall berechnet die Normalisierungsfunktion einfach die Prozentpunkte, d.h. das Notenschema bildet direkt Prozentpunkte auf Noten ab.
Falls zum Aufgabenheft gar keine Property normalisierung
in einer der drei obigen Varianten angegeben wird, heißt das prinzipiell, dass diese Standard-Normalisierung (Anwendung des Notenschemas auf Prozentpunkte) verwendet wird.
Beim Import einer JSON-Datei gilt jedoch auch hier – wie bei anderen Properties auch –, dass im JSON fehlende Angaben bedeuten, dass die entsprechenden Angaben im Zielkurs nicht überschrieben werden sollen. Falls Sie also in einen Kurs, der bereits ein Aufgabenheft mit Nicht-Standard-Normalisierung oder abgeschalteter Normalisierung enthält, ein JSON importieren, das keine Normalisierungs-Angaben zu diesem Heft enthält, werden die bestehenden Normalisierungseinstellungen dabei nicht überschrieben, also nicht auf Standard-Prozentpunkte-Normalisierung zurückgesetzt.
Um also in einer zu importierenden JSON-Datei explizit vorzugeben, dass Sie die Standard-Normalisierung einstellen möchten, selbst wenn im Ziel-Heft bereits eine abweichende Einstellung vorliegen sollte, aktivieren Sie diese auf eine der beiden Weisen, die unter „ad 1.“ und „ad 2.“ beschrieben wurden. Am einfachsten ist es, eine leere Kontrollpunkte-Funktion (s. ad 2.) festzulegen, indem Sie einfach ein leeres Array (also eine leere Kontrollpunkte-Funktion) zuweisen:
"normalisierung": []
Alternativ funktioniert natürlich auch eine Default-Angabe zur Lotse-Normalisierung (ad 1.) wie folgt:
"normalisierung": {
"bonusNormalpunkte": 0,
"bonusRohpunkte": 0,
"steigung": ""
}
Beides legt explizit Standard-Normalisierung fest, die erste Variante ist aber offensichtlich die einfachere.
Ein Notenschema wird angegeben als Menge von Paaren aus jeweils einer Note sowie der Mindestpunktzahl (in Normalpunkten), ab welcher die Note zu vergeben ist.
In der Konfigurationsdatei sind diese Paare als Properties des notenschema
-Objekts anzugeben, wobei die Note als Key (String der Form 3,0
) und die Mindest-Normalpunktzahl als Integer-Value angegeben werden.
Beispiel 2.3 (Notenschema):
{"aufgabenhefte": {
…
"3": {
…
"benotung": "PER_SCHEMA",
"notenspiegel": false,
"normalisierung": …,
"notenschema": {
"1,0": 95,
"1,3": 90,
"1,7": 85,
"2,0": 80,
"2,3": 75,
"2,7": 70,
"3,0": 65,
"3,3": 60,
"3,7": 55,
"4,0": 45
}
}
}}
aufgaben
-Property von AufgabenheftDie Einstellungen zu einer bestimmten Aufgabe geben Sie ebenfalls als JSON-Object an (dessen Properties im Abschnitt Aufgaben-Properties beschrieben werden). Im JSON-Dokumentbaum ist ein solches Aufgaben-Objekt in die Aufgabenliste eines Aufgabenheftes einzufügen.
Dazu besitzt jedes Aufgabenheft-Objekt (Eintrag innerhalb der aufgabenhefte
-Property des Root-Objects, s.o.) eine Property namens aufgaben
. Analog zur aufgabenhefte
-Property kann es sich auch dabei wieder wahlweise um ein JSON-Array oder ein JSON-Object handeln. Im Falle eines Arrays korrespondiert wieder der erste Array-Eintrag mit der ersten Aufgabe des jeweiligen Hefts, der zweite Array-Eintrag mit Aufgabe Nr. 2 etc.. Bei Notation als JSON-Object ist wieder die Aufgabennummer als Key dem Objekt mit den Aufgaben-Properties voranzustellen.
Beispiel 2.4 mit JSON-Array:
{"aufgabenhefte": {
"1": {
"bearbeitungsbeginn": "01.04.2018, 00:00",
"bearbeitungsende": "14.04.2018, 24:00",
"aufgaben": [
{
"name": "Meine erste Aufgabe",
"teilaufgaben": [
{"punkte": 10},
{"punkte": 1}
],
"korrekturart": "HAND"
},
{
"name": "Aufgabe 2",
"punkte": 12,
"korrekturart": "HAND"
},
]
}
}}
Beispiel 2.5 mit JSON-Object:
{"aufgabenhefte": {
"1": {
"bearbeitungsbeginn": "01.04.2018, 00:00",
"bearbeitungsende": "14.04.2018, 24:00",
"aufgaben": {
"1": {
"name": "Meine erste Aufgabe",
"teilaufgaben": [
{"punkte": 10},
{"punkte": 1}
],
"korrekturart": "HAND"
},
"2": {
"name": "Aufgabe 2",
"punkte": 12,
"korrekturart": "HAND"
},
}
}
}}
aufgabenbloecke
-Property von AufgabenheftDie Aufgaben eines Aufgabenhefts können inzwischen optional (vollständig oder teilweise) zu Aufgabenblöcken zusammengefasst werden, im Wesentlichen mit zwei Zielsetzungen:
shuffle
) oder einen einzigen bestimmter Heftausschnitt (siehe shuffleVon
und shuffleBis
) in eine individuelle Zufallsreihenfolge bringen zu lassen:
Die Aufgaben eines Aufgabenblocks werden im JSON genau wie „alleinstehende“ Aufgaben auch in der aufgaben
-Property definiert. Die Blockstruktur des Hefts (welche seiner Aufgaben Blöcke bilden sollen) wird dann zusätzlich in der aufgabenbloecke
-Property festgelegt. Für Hefte, die keine Blockstrukturierung verwenden (Default), muss diese Property nicht angegeben werden.
Diese Property – wenn angegeben – ist immer ein JSON-Array von Block-Objekten, wobei die Arrayindizes bzw. die Reihenfolge prinzipiell keine Rolle spielt: Es handelt sich einfach um eine Auflistung aller Blöcke des Hefts in beliebiger Reihenfolge.
Die Properties der Block-Objekte werden im Abschnitt Aufgabenblock-Properties dokumentiert.
Beispiel 2.6
{"aufgabenhefte": {
"1": {
…,
"shuffle": true,
"aufgaben": {
"1": {…},
"2": {…},
"3": {…},
"4": {…},
"5": {…},
"6": {…},
"7": {…},
},
"aufgabenbloecke": [
{
"von": 2,
"bis": 5,
"shuffle": true
},
{
"von": 6,
"bis": 7,
"name": "Benanntes Paar",
"shuffle": false
}
]
}
}}
Dieses Beispiel zeigt ein Aufgabenheft aus 7 Aufgaben. Aufgabe 1 gehört zu keinem Aufgabenblock, Aufgaben 2 bis 5 bilden einen unbenannten Block, der den Studierenden daher nicht als Unterstruktur angezeigt wird, während die Aufgaben 6 und 7 einen benannten Block bilden, der für die Studierenden sichtbar ist und den Namen / die Überschrift „benanntes Paar“ trägt.
Die Aufgaben 6 und 7 werden nicht randomisiert, sondern den Studierenden immer in dieser Reihenfolge präsentiert: Unter der Block-Überschrift „benanntes Paar“ wird immer Aufgabe 6 gefolgt von Aufgabe 7 angezeigt. Die Aufgaben des Blocks 2-5 werden untereinander gemischt. Weiterhin ist shuffle
auch fürs Aufgabenheft eingestellt, d.h. die Aufgabe 1, der Block 2-5 und der benannte Block werden nochmals in eine Zufallsreihenfolge gebracht. (Dabei ist also gewährleistet, dass die Blöcke stets zusammenhängend sind, die Aufgabe 1 also nicht z.B. irgendwo zwischen den Aufgaben eines Blocks angezeigt wird, sondern entweder als erste oder letzte Aufgabe des Hefts oder zwischen den beiden Blöcken.)
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
von |
Integer | Aufgabennummer der ersten Aufgabe des Blocks |
bis |
Integer | Aufgabennummer der letzten Aufgabe des Blocks, muss > von sein! |
name |
String | Optional der Name des Blocks, wenn er benannt sein soll. |
shuffle |
Boolean | true für Zufallsreihenfolge der Aufgaben des Blocks (blocklokale Randomisierung) |
random-selection |
Integer | Zahl > 0 (und < Blocklänge) für Aktivierung einer Zufallsauswahl von Aufgaben des Blocks (blocklokale Randomisierung), 0 zum Abschalten der Zufallsauswahl (stets alle Aufgaben zeigen) |
Wichtige Hinweise zum JSON-Import
Wenn Sie zu einem Aufgabenheft die aufgabenbloecke
-Property in einem zu importierenden JSON-File angeben, dann werden die ggf. schon im System existierenden Blöcke mit dem angegebenen Array abgeglichen: Zu jedem bereits in der Datenbank existierenden Block mit derselben Start-Aufgabennummer (von
) werden werden die restlichen Werte mit den Angaben aus dem JSON abgeglichen, noch fehlende Blöcke werden neu erzeugt, und existierende Blöcke mit Startnummern, zu denen kein Eintrag im JSON-Array existiert, werden gelöscht.
Die Angaben der obigen Properties sollten daher nach Möglichkeit vollständig sein! Bei Aufgabenblöcken gilt also explizit nicht das ansonsten im JSON-Import angewendete Verfahren, dass bei Nicht-Angabe von Properties im JSON die entsprechenden im System bereits vorliegenden einfach unverändert bleiben.
Die Properties von
und bis
sind in jedem Fall Pflichtangaben, ansonsten wird das ganze Block-Objekt nicht importiert. Das Weglassen der Property name
kennzeichnet immer einen unbenannten Block (entspricht also der Angabe von "name": ""
). Falls die shuffle
-Angabe fehlt, ist das stets gleichbedeutend mit "shuffle": "false"
, eine fehlende random-selection
ist gleichbedeutend mit "random-selection": 0
.
Für jedes Aufgaben-Objekt (siehe vorigen Abschnitt) können wieder die Aufgaben-Einstellungen über die folgenden Properties angegeben werden. (Nicht im JSON enthalten sind die Standard-Kursressourcen, also die HTML-Dokumente mit Aufgabenformular, Quittungsvorlage, Korrekturvorlage, Musterlösungstext etc.; die sind neben der Konfigurationsdatei getrennt als Kursressourcen hochzuladen.)
Zur Bedeutung der einzelnen Einstellungen lesen Sie bitte die Online-Hilfe zu den entsprechenden Eingabefeldern in der Benutzeroberfläche der fortgeschrittenen Aufgabenerstellung.
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
name |
String | Aufgabenname |
korrekturart |
String | Einer der folgenden Werte: "AUTO" , "AUTOLEER" , "AUTOHAND" , "HAND" , "KEINE" |
korrekturmodul |
Object | Name und Einstellungen zum Korrektur-/Bewertermodul (nur bei "korrekturart": "AUTO…" ), siehe (Vor-)Korrekturmodul-Einstellungen |
thema |
String | Nur bei bestimmten Aufgaben zu Prüfungen, nicht für alle Kurse: Prüfungsthema, das von den Aufgabenteilnehmern gewählt sein muss oder durch Bearbeitung der Aufgabe gewählt wird. |
teilaufgaben |
Array oder Object | Teilaufgaben-Properties (im Falle einer in mehrere (technische) Teilaufgaben zerlegten Aufgabe, s.u.) |
Einstellungen wie erreichbare Punktzahl oder Vorkorrekturmodule werden pro (technischer) Teilaufgabe vorgenommen. Dazu dient die Property teilaufgaben
. Analog zu den Properties aufgabenhefte
und aufgaben
darf auch dies wieder wahlweise ein JSON-Array oder JSON-Object sein. Im ersten Fall bezieht sich wieder das erste Element des Arrays auf die erste Teilaufgabe (a
), das zweite auf Teilaufgabe b
etc., bei Notation als Object sind den Teilaufgaben-Objekten jeweils die Keys der Form "a"
für die erste, "b"
für die zweite Teilaufgabe etc. voranzustellen.
Da die Anzahl der Teilaufgaben einer Aufgabe (wenn überhaupt größer als 1) in der Regel eher klein ist und Teilaufgaben auch jeweils nur bis zu zwei Properties haben, und da außerdem typischerweise in der JSON-Datei auch alle Teilaufgaben zur Aufgabe (und nicht nur z.B. die zweite) konfiguriert werden sollen, ist hier i.A. die Array-Schreibweise hinreichend übersichtlich.
Falls eine Aufgabe aus genau einer Teilaufgabe besteht, wird bereits in der Weboberfläche der fortgeschrittenen Aufgabenerstellung eine andere Darstellung gewählt, indem Punkte und Vorkorrekturmodul einfach als Eigenschaften der „atomaren“ Aufgabe präsentiert werden und nicht als Eigenschaften der (einzigen) Teilaufgabe. Auch im JSON ist es dann nicht nötig, eine teilaufgaben
-Property anzugeben, sondern Sie können die Teilaufgaben-Properties dann auch direkt im Aufgaben-Objekt angeben.
Beispiel 3.1:
Betrachten Sie erneut obiges Listing aus Beispiel 2.4 oder 2.5: In beiden Fällen besteht Aufgabe 1.1 aus zwei Teilaufgaben, und da die Punkte eine Teilaufgaben-Property sind (s.u.) werden sie unter teilaufgaben
notiert – hier in Array-Schreibweise. Die alternative Object-Schreibweise sähe wie folgt aus :
"teilaufgaben": {
"a": {"punkte": 10},
"b": {"punkte": 1}
},
Aufgabe 1.2 dagegen besteht im Beispiel aus nur einer einzigen Teilaufgabe, weshalb auf eine (ebenfalls korrekte, aber unnötig komplexe) Angabe wie …
"teilaufgaben": [
{"punkte": 12}
]
… verzichtet wurde und die Punkte-Property vielmehr direkt im Aufgaben-Objekt mit aufgenommen wurde.
An Teilaufgaben-Properties beschränken sich obige Beispiele auf den typischen Fall reiner Punktzahlangaben, d.h. es wird kein Vorkorrekturmodul konfiguriert. Eine vorkorrekturmodul
-Property (vgl. folgenden Abschnitt) stünde ansonsten jeweils im selben Objekt wie die punkte
-Property.
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
punkte |
Integer | Erreichbare Punktzahl zur Teilaufgabe |
vorkorrekturmodul |
Object | Name und Einstellungen zum Vorkorrekturmodul, das aus den Eingaben zur Teilaufgabe ein Sofortfeedback erzeugen soll, siehe (Vor-)Korrekturmodul-Einstellungen |
Die zu einer Aufgabe erreichbare Punktzahl errechnet sich als Summe der in den einzelnen Teilaufgaben erreichbaren Punktzahlen. Die getrennte Erfassung von Teilpunktzahlen pro Teilaufgabe ist nicht unbedingt nötig, das ist eher eine Frage der Übersichtlichkeit. Es ist genauso möglich, die gesamte erreichbare Punktzahl der ersten Teilaufgabe zuzuordnen und zu allen weiteren Teilaufgaben jeweils 0 erreichbare Punkte einzutragen.
Die JSON-Objekte für Korrekturmodule und Vorkorrekturmodule sind jeweils gleich aufgebaut und können folgende zwei Properties umfassen:
Key | Value-Type | Inhalt / Format / Werte |
---|---|---|
name |
String | Name des (Vor-)Korrekturmoduls, unter dem es sich beim Online-Übungssystem registriert. |
eigenschaften |
String | Properties-String mit den Einstellungen zum (Vor-)Korrekturmodul. White-Spaces wie Zeilenumbrüche und Tabulatoren im Properties-String sind durch Escape-Characters darstellbar. |
Beispiel: Korrekturmodul (interner Aufgabenbewerter)
{"aufgabenhefte": {
"4": {
"aufgaben": {
"2": {
"name": "AB",
"punkte": 100,
"korrekturart": "AUTO",
"korrekturmodul": {
"name": "AufgabenBewerter",
"eigenschaften": "Init:\r\n\tAufgabentyp:\t1AUSN\r\n\tName:\t\tEinfachauswahl\r\n\tKommentar:\t\r\n\tPunkte:\t\t100\r\n\tGewichtung:\t1\r\n\tN:\t\t4\r\n\tVorgabe:\tA\r\n"
}
}
…
}
}
}}
Was genau beim Upload einer ZIP-Datei mit Konfigurationsdatei und Standard-Kursressourcen (Aufgaben-Ressourcen) in einen leeren Kurs passiert: Zuerst wird überprüft, ob der Zielkurs schon Aufgaben enthält. Ist das der Fall, muss die Config-JSON-Datei passend zum Kurs benannt sein, sonst wird sie ignoriert. Enthält der Kurs dagegen noch keine Aufgaben, ist ihr Name egal. Ausgewertet wird die Datei noch nicht (das hätte ja auch noch keinen Effekt, so lange noch keine Aufgaben existieren). Vielmehr werden dann zunächst alle (Standard- und Nicht-Standard-)Kursressourcen aus dem ZIP-File importiert. Falls Standard-Kursressourcen (wie aufgabe1.1.html
) dabei waren, werden im Anschluss die zugehörigen Aufgaben (z.B. Aufgabe 1 zu Heft 1) erzeugt, und die Hefte dazu ebenfalls, sollten sie nicht bereits existieren. Die neu erzeugten Hefte und Aufgaben bekommen zunächst Standard-Einstellungen. Abschließend wird dann die im Upload gefundene Config-JSON (sofern vorhanden und nicht ignoriert, s.o.) verarbeitet, also alle darin vermerkten Einstellungen auf die (ggf. im vorigen Schritt erst erzeugten) Aufgabenhefte und Aufgaben übertragen. ↩
Zukünftig könnte das Format eventuell um weitere Einstellungen wie Kursparameter erweitert werden. ↩