wiki:WikiStart

Version 3 (modified by enno, 4 months ago) ( diff )

--

Welcome to the Flex-O-Grader project

Überblick

Dieses Toolkit stellt eine einfache, vollständig offline-fähige Lösung zur Erstellung, Durchführung und Auswertung von Prüfungen oder Selbsttests bereit – speziell geeignet für *Erwachsenenschulungen, Fortbildungen und Testverfahren in klassifizierten oder netzabgeschotteten Umgebungen*.

Alle Komponenten sind leichtgewichtig, transparent und portabel.

Komponenten

Das System besteht aus drei unabhängig nutzbaren Werkzeugen:

Werkzeug Zweck Technologie
~builder~ Erstellen und Exportieren von Prüfungsfragen Python (Tkinter)
~generator~ Generierte statisches HTML anhand einer json/Beschreibung zur Durchführung der Prüfung im Browser (offline) PYTHON/JINJA2/HTML/CSS/JS

| ~evaluator~ | Auswertung der Antworten & Statistiken | Python (CLI/GUI) |

Alle Werkzeuge arbeiten lokal, ohne Netzwerkanbindung oder zentrale Server.

  • builder: Frageneditor & Export

Das Python-GUI-Tool erlaubt Prüfern:

  • Aufbau eines Fragenkatalogs zur Wiederverwendung
  • Zuweisung von Metadaten pro Frage:
    • ~domain~ (z. B. „Elektronik“)
    • ~topic~ (z. B. „Spannungsteiler“)
    • ~difficulty~ (1 = leicht, 5 = schwer)
  • Einbindung von Bildern, Video- oder Audiodateien
  • Export ausgewählter Fragen als Archiv mit:
    • ~exam.json~
    • zugehörigen Medien (~/media/images/~, ~/media/audio/~, ~/media/video/~)
  • generator: Generiert offline-Prüfungsumgebung im Browser

Erzeugt statischen HTML-/JavaScript-Prüfungsclient, lauffähig ohne Server:

  • Startbar direkt im Browser (USB-Stick, CD, Airgap-Systeme)
  • Keine Internetverbindung oder Anmeldung erforderlich

Funktionen:

  • Seitennavigation („Zurück“ / „Weiter“)
  • Unterstützte Fragetypen:
    • Einfachauswahl (Radio)
    • Mehrfachauswahl (Checkbox)
    • Freitextantwort
    • optional Bild-, Video- oder Audiowiedergabe pro Frage
  • Eingabe von PersDat
  • Antworten werden am Ende des Tests im json-Format heruntergeladen
  • Beispiel: Antwortdatei

#+begin_src json {

"meta": {

"test_id": "ET-2025-09-001", "test_name": "Elektrotechnik", "created_on": "2025-09-17T08:30:00Z", "student_name": "Enrico Schwass", "student_id": "12345678", "submitted_at": "2025-09-23T15:55:51.158Z"

}, "answers": [

{

"id": "candidate_id", "fields": [

{

"name": "last_name", "value": "Schwass"

}, {

"name": "first_name", "value": "Enrico"

}, {

"name": "personal_id", "value": "12345678"

}

]

}, {

"id": "TB801", "value": "A"

}, {

"id": "TB802", "value": "D"

}, {

"id": "TB803", "value": "D"

}, {

"id": "TB804", "value": [

"C", "B"

]

}, {

"id": "TB805", "value": "A"

}, {

"id": "TB806", "value": "B"

}, {

"id": "TB807", "value": "B"

}

]

} #+end_src

  • evaluator: Auswertung & Statistik

Ein Python-Tool zur Auswertung eingereichter Antworten.

Funktionen:

  • Vergleicht Antworten mit ~exam.json~
  • Pro Teilnehmer:
  • Gesamtstatistik:
    • Fehlerquoten pro Frage
    • Durchschnittliche Schwierigkeit
    • Fragen mit hoher Fehlerhäufigkeit
  • Exportformate:
    • Text
    • HTML
    • PDF als Zertifikat
  • Datenstruktur: Examen (~exam.json~)

#+begin_src json {

"meta": {

"title": "Elektrotechnik", "duration": "30 Minuten", "allowed_aids": "keine", "headline": "DATAV Schutzbereich 2, 10039691S", "intro_note": "Bitte lesen Sie jede Frage sorgfältig und beachten Sie die Hinweise.", "submit_note": "Sie können Ihre Antworten jetzt einreichen. Eine spätere Änderung ist nicht mehr möglich.", "exam_id": "ET-2025-09-001", "created_on": "2025-09-17T08:30:00Z", "created_by": "OSF Schwass"

},

"pages": [

{

"title": "Personaldaten", "questions": [

{

"id": "candidate_id", "type": "candidate_id", "domain": "management", "topic": "identification", "text": "Bitte geben Sie Ihre Personaldaten ein:", "fields": [

{

"id": "last_name", "label": "Nachname", "validation": {

"required": true, "maxlength": 30

}

}, {

"id": "first_name", "label": "Vorname", "validation": {

"required": true, "maxlength": 30

}

}, {

"id": "personal_id", "label": "Personalnummer", "validation": {

"required": true, "pattern": "
d{8}", "maxlength": 8

}

}

]

}

]

}, {

"title": "Seitenband", "questions": [

{

"id": "TB801", "type": "radio", "domain": "signals", "topic": "forms", "text": "Was ist der Unterschied zwischen AM und SSB?", "options": [

{"id": "A", "points": 1, "text": "AM hat einen Träger und zwei Seitenbänder, SSB arbeitet mit Trägerunterdrückung und einem Seitenband."}, {"id": "B", "points": 0, "text": "AM hat einen Träger und ein Seitenband, SSB arbeitet mit Trägerunterdrückung und hat zwei Seitenbänder."}, {"id": "C", "points": 0, "text": "AM hat keinen Träger und zwei Seitenbänder, SSB arbeitet mit Trägerunterdrückung und einem Seitenband."}, {"id": "D", "points": 0, "text": "AM hat keinen Träger und zwei Seitenbänder, SSB arbeitet mit Träger und einem Seitenband."}

]

}, {

"id": "TB802", "type": "radio", "domain": "signals", "topic": "forms", "text": "Was ist der Unterschied zwischen LSB und USB?", "options": [

{"id": "A", "points": 1, "text": "LSB arbeitet mit Trägerunterdrückung und dem unteren Seitenband, USB arbeitet mit Trägerunterdrückung und dem oberen Seitenband."}, {"id": "B", "points": 0, "text": "LSB arbeitet mit Träger und zwei Seitenbändern, USB arbeitet mit Trägerunterdrückung und einem Seitenband."}, {"id": "C", "points": 0, "text": "LSB arbeitet mit Träger und einem Seitenband, USB arbeitet mit Trägerunterdrückung und beiden Seitenbändern."}, {"id": "D", "points": 0, "text": "LSB arbeitet mit Trägerunterdrückung und dem oberen Seitenband, USB arbeitet mit Trägerunterdrückung und dem unteren Seitenband."}

]

}

]

}, {

"title": "Modulation", "questions": [

{

"id": "TB803", "type": "radio", "domain": "signals", "topic": "forms", "text": "Welche Aussage über modulierte Signale ist richtig?", "options": [

{"id": "A", "points": 1, "text": "Bei FM ändert sich die Amplitude des Sendesignals bei Modulation nicht."}, {"id": "B", "points": 0, "text": "Bei SSB ändert sich die Amplitude des Sendesignals bei Modulation nicht."}, {"id": "C", "points": 0, "text": "Bei FM ändert sich die Amplitude des Sendesignals bei Modulation im Rhythmus der Sprache."}, {"id": "D", "points": 0, "text": "Bei AM ändert sich die Amplitude des Sendesignals bei Modulation nicht."}

]

}, {

"id": "TB804", "type": "checkbox", "domain": "signals", "topic": "forms", "text": "Welche der folgenden Antworten beschreiben Modulationsverfahren?", "options": [

{"id": "A", "points": 1, "text": "FM"}, {"id": "B", "points": 1, "text": "AM"}, {"id": "C", "points": 1, "text": "QAM"}, {"id": "D", "points": 0, "text": "PSK"}

]

}

]

}, {

"title": "Strassenverkehr", "questions": [

{

"id": "TB805", "type": "radio", "domain": "traffic", "topic": "right of way", "text": "Welches Fahrzeug verhaelt sich falsch??", "options": [

{"id": "A", "points": 1, "text": "Das rote"}, {"id": "B", "points": 0, "text": "Das blaue"}

], "media": [{"type": "image", "src": "media/Vorfahrt.png"}]

}

]

}, {

"title": "Signale", "questions": [

{

"id": "TB806", "type": "radio", "domain": "signals", "topic": "sound", "text": "Was hoeren Sie?", "options": [

{"id": "A", "points": 0, "text": "Fernschreiber"}, {"id": "B", "points": 1, "text": "Tastfunk"}

], "media": [{"type": "audio", "src": "media/Code_40.mp3"}]

}, {

"id": "TB807", "type": "radio", "domain": "signals", "topic": "visual", "text": "Was sehen Sie?", "options": [

{"id": "A", "points": 0, "text": "Fernschreiber"}, {"id": "B", "points": 1, "text": "Stoerungen"}

], "media": [{"type": "video", "src": "media/spectrum.mp4"}]

}

]

}

]

} #+end_src

  • Projektziele
  • Minimale, auditierbare JavaScript-Logik
  • ~jinja2~-basierte HTML-Erzeugung aus JSON
  • Vollständig portable und selbstenthaltende Prüfungen
  • Keine Framework-Abhängigkeiten
  • Optionale Erweiterungen
  • Git-Versionierung von Fragen
  • Feedback-Auswertung pro Thema
  • Anpassbares Layout/CSS
  • Lizenz

Internes Projekt (Lizenzierung noch offen, eher MIT)

Please find a working demo here: Demo Exam

Note: See TracWiki for help on using the wiki.