Demo
SCRUM
Willkommen beim "Flex-O-Grader"-Projekt
Ü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“)
- 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 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
{ "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" } ] }
Evaluator: Auswertung & Statistik
Ein Python-Tool zur Auswertung eingereichter Antworten.
===Funktionen:
- Vergleicht Antworten mit ~exam.json~
- Pro Teilnehmer:
- Punkteübersicht
- Stärken/Schwächen nach Themengebiet
- Gesamtstatistik:
- Fehlerquoten pro Frage
- Durchschnittliche Schwierigkeit
- Fragen mit hoher Fehlerhäufigkeit
- Exportformate:
- Text
- HTML
- PDF als Zertifikat
Datenstruktur: Examen (exam.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"}] } ] } ] }
Projektziele
- Minimale, auditierbare 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)