= 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“) * 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 {{{#!js { "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) {{{#!js { "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 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: [https://kokyou.dev/flexograder/chrome/site/test/exam.html Demo Exam]