- Einleitung
- Konfigurationsdateien
- Schritt für Schritt Konfiguration
- Einrichtung der Webseite
- Gradle
Das Framework besteht aus zwei Komponenten: Die Webkomponente erlaubt das Erstellen einer Webseite, auf der sich Studenten zum Übungsbetrieb anmelden können. Die Gradle-Komponente benutzt die Registrierungen, um eine Übungsgruppeneinteilung zu erstellen.
Folgende Dateien erlauben die Konfiguration des Frameworks:
.
├── gradle
│ └── resources
│ └── configuration.json
└── web
├── content
│ └── description.md
│ └── configuration.json
└── style
└── style.cssconfiguration.json: Diese JSON Datei enthält die gesamte Konfiguration des Frameworks.description.md: In dieser Markdown Datei können Informationen zu Anmeldung verfasst werden, die auf der Webseite angezeigt werden.style.css: Ein CSS Stylesheet, um die Webseite zu formatieren.
Dieser Abschnitt beschreibt die Beispielkonfiguration des Frameworks, die sich in example_configuration/configuration.json befindet.
Der groups Eintrag in der JSON Datei enthält eine Liste aller Gruppen. Ein Gruppeneintrag enthält die folgenden Informationen:
{
"id" : "Gruppe_1",
"location" : "SR 3",
"time" : "Montag 12:15 - 13:45",
"label": "Gruppe 1",
"capacity": 15
}
id: Eine eindeutige ID für die Gruppe.location: Der Ort der Übung.time: Termin der Übung.label: Gruppenbezeichnung, der auf der Webseite und in den generierten Dateien angezeigt wird.capacity: Die Kapazität der Gruppe, wird bei der Optimierung der Gruppeneinteilung verwendet.
Die Beispielkonfiguration enthält 5 Gruppen:
"groups" :
[
{
"id" : "Gruppe_1",
"location" : "SR 3",
"time" : "Montag 12:15 - 13:45",
"label": "Gruppe 1",
"capacity": 15
},
{
"id" : "Gruppe_2",
"location" : "SR 2",
"time" : "Montag 12:15 - 13:45",
"label": "Gruppe 2",
"capacity": 15
},
{
"id" : "Gruppe_3",
"location" : "SR 1",
"time" : "Montag 14:15 - 15:45",
"label": "Gruppe 3",
"capacity": 15
},
{
"id" : "Gruppe_4",
"location" : "HS 1",
"time" : "Montag 10:15 - 11:45",
"label": "Gruppe 4",
"capacity": 15
}
]Hinter dem Gruppenlabel können zusätzliche Informationen angezeigt werden. Dies kann mit groupLabels konfiguriert werden:
"groupLabels" : ["location", "time"]Diese Konfiguration generiert zum Beispiel für Gruppe 1 die folgende Gruppenbezeichnung auf der Webseite:
Gruppe 1 ( SR3, Montag 12:15 - 13:45 )
Bei der Anmeldung zu den Gruppen müssen Studenten ihre Präferenzen angeben. Mögliche Präferenzen werden als Liste im choices Eintrag festgelegt. Eine Präferenzdefinition besteht aus zwei Teilen:
{
"label" : "unmöglich",
"value" : 0
}label: Die angezeigte Bezeichnung für die Präferenz während der Anmeldung.value: Der interne Wert, der bei der Optimierung benutzt wird.
Der Wert 0 bedeutet, dass eine Teilnahme nicht möglich ist. Höhere Werte bedeuten eine höhere Präferenz.
Die Beispielkonfiguration enthält 4 mögliche Präferenzen:
"choices" :
[
{
"label" : "unmöglich",
"value" : 0
},
{
"label" : "passt notfalls",
"value" : 1
},
{
"label" : "passt",
"value" : 2
},
{
"label" : "passt sehr gut",
"value" : 3
}
]Es ist möglich, Einschränkungen für die Gruppenanmeldungen festzulegen. Dies kann im `groupConditions` Eintrag getan werden, der eine Liste an Bedingungen enthält. Momentan werden zwei Bedingungstypen unterstützt:
{
"type" : "atLeast",
"amount" : 2
}"amount" stellt die Gruppenanzahl dar, die der Student mindestens ausgewählt haben muss.
{
"type": "atLeastOne",
"of" : ["Gruppe_1", "Gruppe_4"]
}`of` enthält eine Liste von Labels, die zu Gruppen gehören, von denen der Student mindestens eine auswählen muss.
In der Beispielkonfiguration werden beide Bedingungen genutzt:
"groupConditions" :
[
{
"type" : "atLeast",
"amount" : 2
},
{
"type": "atLeastOne",
"of" : ["Gruppe_1", "Gruppe_4"]
}
]Persönliche Daten, die der Student angeben muss, werden als Liste im studentData Feld festgelegt. Ein Eintrag in dieser Liste hat folgende Form:
{ "name": "Vorname", "type": "text" }name: Bezeichnung für den Eintrag.type: Der HTML-Eingabetyp, der verwendet werden soll.
Die Beispielkonfiguration legt folgende Daten fest:
"studentData" :
[
{ "name": "Vorname", "type": "text" },
{ "name": "Nachname", "type": "text" },
{ "name": "Geburtsdatum", "type": "date" },
{ "name": "E-Mail", "type": "email" },
{ "name": "Matrikelnummer", "type": "number" },
{ "name": "Fach", "type": "text" },
{ "name": "Fachsemester", "type": "number" },
{ "name": "Studiensemester", "type": "number" }
]Eines dieser Eingabedaten muss als eindeutige Identifikation des Studenten in der Datenbank verwendet werden. Dies geschieht im studentID Feld der JSON Datei. In unserer Beispielkonfiguration benutzen wir die Matrikelnummer als ID:
"studentId" : "Matrikelnummer"Die gradle Komponente kann genutzt werden, um für die einzelnen Übungsgruppen Punktelisten im CSV Format zu erstellen, die später von den Übungsgruppenleitern ausgefüllt werden können. Folgende Informationen können im exerciseSheets Eintrag festgelegt werden:
label: Bezeichnung der Übungsblätter, die durchnummeriert wirdexerciseSheetAmount: Anzahl der ÜbungsblätterstudentData: Studentendaten, die in der CSV Datei auftauchen
Die Beispielkonfiguration legt folgende Einstellungen fest:
"exerciseSheets" : {
"label" : "Blatt",
"exerciseSheetAmount" : 10,
"studentData" : [
"Vorname", "Nachname", "Matrikelnummer"
]
}Ein Ausschnitt der erzeugten Tabelle sieht dann wie folgt aus:
| Vorname | Nachname | Matrikelnummer | Blatt 1 | Blatt 2 |
|---|---|---|---|---|
| Max | Mustermann | 123456 | 0 | 0 |
Ähnlich wie bei den Punktelisten, kann die gradle Komponente auch eine Notenliste im CSV Format generieren. Folgende Einstellungen sind im gradeSheet Eintrag möglich:
studentData: Studentendaten, die in der Tabelle erscheinen sollengradeData: Noteninformationen, die in die Tabelle eingetragen werden
Die Beispielkonfiguration
"gradeSheet" : {
"studentData" : [
"Vorname", "Nachname", "Matrikelnummer", "Geburtsdatum"
],
"gradeData" : [
"Note", "Bezeichnung"
]
}würde eine Tabelle im folgenden Format erzeugen:
| Vorname | Nachname | Matrikelnummer | Geburtsdatum | Note | Bezeichnung |
|---|---|---|---|---|---|
| Max | Mustermann | 123456 | 01.01.1998 | 1.0 | sehr gut |
Die Webkomponente hat folgende Voraussetzungen:
- PHP >= 5.0
- SQLite Unterstützung in PHP
- Webserver mit .htaccess Unterstützung
Die Anmeldungen werden in einer SQLite Datenbank im Order output gespeichert. Es ist wichtig, dass dieser Ordner geschützt wird, um einen Zugriff auf sensible Daten zu verhindern. Dies kann mit .htaccess erreicht werden. Unter Linux würden wir den Schutz folgendermaßen einrichten:
Zuerst erzeugen wir das Ausgabeverzeichnis
mkdir outputNun legen wir die .htaccess Datei an und blockieren jeglichen Zugriff auf den Ordner:
cd output
touch .htaccess
echo "Require all denied" >> .htaccessDie erzeugte .htaccess hat somit den folgenden Inhalt:
Require all deniedBei Aufrufen der Website wird immer überprüft, ob der Ordner output existiert und wird bei Bedarf angelegt. Fernerhin wird dann auch eine .htaccess Datei generiert, die wie oben jeglichen Zugriff auf den Ordner blockiert.
Nachdem die Konfiguration abgeschlossen ist, werden folgende Dateien auf den Webserver kopiert, wobei die Verzeichnisstruktur erhalten bleiben muss:
.
├── content
│ ├── config.json
│ └── description.md
├── index.php
├── lib
│ ├── Builder.inc.php
│ ├── Database.inc.php
│ ├── FormBuilder.inc.php
│ ├── FormBuilderDisplay.inc.php
│ ├── FormBuilderLocked.inc.php
│ ├── SQLiteWriter.inc.php
│ ├── Verifier.inc.php
│ └── thirdparty
│ ├── LICENSE.txt
│ └── Parsedown.php
└── style
└── style.cssDie Seite ist nun erreichbar und Studenten können sich für die Übungsgruppen anmelden. Die Anmeldungen werden in der Datenbank
.
└── output
└── database.dbgespeichert.
- Java Version >=7
Um das Gradle Framework nutzen zu können, führen wir folgende Schritte durch: Wir laden zunächst die Datei database.db von unserem Webserver herunter und platzieren sie in:
.
└── gradle
└── resourcesDanach speichern wir dort auch die Konfigurationsdatei configuration.json ab.
Mit Hilfe des Befehls
./gradlew buildunter Linux oder
gradlew.bat buildunter Windows werden die Ergebnisdateien erstellt:
Punktelisten im CSV Format, die von den einzelnen Übungsgruppenleitern ausgefüllt werden können, befinden sich im Ordner:
.
└── gradle
└── build
└── pointListsEine CSV Datei, die als Notenliste später dienen kann, wird hier abgespeichert:
.
└── gradle
└── build
└── gradeList
└── gradeSheet.csvEine Markdown Datei, die die gesamte Gruppeneinteilungen beinhaltet, befindet sich in der Datei
.
└── gradle
└── build
└── groupsMarkdown
└── groups.mdDiese Markdown Datei kann zum Beispiel mit Hilfe des Tools pandoc in andere Formate, wie PDF oder HTML umgewandelt werden.
Der Aufruf
./gradlew createAnalysisMarkdownerstellt die Markdown Datei
.
└── gradle
└── build
└── analysis
└── markdown.mddie zahlreiche Informationen zur Einteilung enthält, wie zum Beispiel die Auslastung der einzelnen Gruppen oder Studenten, die keiner Gruppe zugeordnet werden konnten.
In bestimmten Fällen ist es nötig, dass die Gruppeneinteilung für manche Studenten manuell angepasst werden muss. Diese manuelle Zuteilung kann in der Datei
.
└── gradle
└── build
└── overrides.jsonfestgelegt werden. Diese JSON Datei enthält eine Liste von Einträgen:
[
{ "id" : 123456, "group" : "Gruppe_1" },
{ "id" : 223456, "group" : "Gruppe_2" }
]id ist die ID des Studenten, dessen Gruppe angepasst werden soll. group ist die ID der Gruppe, die dem Studenten zugeordnet werden soll.