wiki:WikiStart

Demo

Demo Exam

SCRUM

SCRUM status

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:
  • 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)

Last modified 2 weeks ago Last modified on 09/30/25 08:58:37
Note: See TracWiki for help on using the wiki.