- Python 72.4%
- HTML 20.7%
- CSS 6.5%
- Dockerfile 0.4%
| certificates | ||
| data | ||
| fonts | ||
| static | ||
| templates | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| app.py | ||
| certificate.py | ||
| content_data.py | ||
| db.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| load_real_content.py | ||
| README.md | ||
| requirements.txt | ||
EU AI Act Schulung – wallPen GmbH
Interne Web-App zur Nachweis-Schulung der KI-Kompetenz (Art. 4 EU AI Act) für ca. 35 Mitarbeiter. Läuft als einzelner Docker-Container, keine externen Abhängigkeiten (SQLite-Datei, kein separater DB-Server).
Ablauf für Mitarbeiter
- Sprache wählen (DE/EN), persönlichen Zugangscode eingeben (6-stellig, von dir erhalten).
- Module nacheinander durchklicken (Text-Inhalte, Button "Weiter").
- Abschlusstest: zufällig ausgewählte Multiple-Choice-Fragen aus dem Fragenpool (Standard: 10 Fragen, 80 % zum Bestehen — beides im Admin-Bereich änderbar).
- Bei Bestehen: PDF-Zertifikat mit Name, Datum, Punktzahl direkt downloadbar.
- Bei Nichtbestehen: Test kann beliebig oft wiederholt werden (neue zufällige Fragenauswahl) — der Zugangscode wird dafür nicht erneut benötigt, er gilt nur für den allerersten Einstieg.
Zugangscodes (Zugriffskontrolle)
Damit nicht beliebige Namen eingetragen werden können und jeder Teilnahme-Datensatz einer echten Person zugeordnet ist, ist der Einstieg in die Schulung an einen einmaligen Zugangscode gekoppelt:
- Im Admin-Bereich unter Zugangscodes legst du pro Mitarbeiter einen Namen an (einzeln oder als Liste "Vorname Nachname", eine Zeile pro Person) — dabei wird automatisch ein kurzer Code (6 Zeichen, keine verwechselbaren Zeichen wie 0/O oder 1/I) erzeugt.
- Die Liste lässt sich als CSV exportieren, um die Codes zu verteilen (z. B. per E-Mail oder Chat, eine Zeile pro Person).
- Ein Code funktioniert genau einmal: Sobald ein Mitarbeiter ihn auf der Startseite eingibt, wird der zugehörige Name automatisch übernommen und der Code sofort als "verwendet" markiert. Ein zweiter Versuch mit demselben Code wird abgelehnt.
- Bricht jemand die Schulung ab oder hat technische Probleme, kannst du den Code im Admin-Bereich mit einem Klick auf Zurücksetzen wieder freigeben.
- Die Übersicht der Teilnahmen zeigt zusätzlich den verwendeten Code an, sodass sich jede Teilnahme eindeutig zurückverfolgen lässt.
Admin-Bereich
Erreichbar unter /admin (Login mit dem Passwort aus der Umgebungsvariable ADMIN_PASSWORD).
- Übersicht: alle Teilnahmen mit Name, Code, Datum, Ergebnis, Status, CSV-Export, Zertifikat-Download.
- Zugangscodes: Codes einzeln oder per Liste anlegen, Status (offen/verwendet) einsehen, zurücksetzen, löschen, CSV-Export zur Verteilung.
- Module: Inhalte anlegen/bearbeiten/löschen (Titel + Text, jeweils DE/EN, Reihenfolge einstellbar).
- Fragen: Fragenpool verwalten (Frage + 4 Antwortoptionen DE/EN, richtige Antwort).
- Einstellungen: Bestehensgrenze (%), Anzahl der Testfragen pro Versuch, Firmenname und Schulungstitel (erscheinen auf dem Zertifikat).
Jedes Modul zeigt zusätzlich eine selbst erstellte Grafik (Rollenmodell, Risikopyramide, Praxis-Regeln, Bußgeldstufen — siehe Abschnitt „Modul-Grafiken" unten). Es gibt aktuell keine echten Videos — Wunsch war zunächst eine reine Text-/Inhalte-Version. Falls später Videos ergänzt werden sollen, ist das der naheliegende nächste Ausbaupunkt (z. B. Video-URL-Feld pro Modul).
Schulungsinhalte (Module & Fragen)
Die App ist mit 4 Modulen und 13 Testfragen zum EU AI Act vorbefüllt (Datei content_data.py):
- Der EU AI Act und die Pflicht zur KI-Kompetenz (Art. 4)
- Risikoklassen des AI Acts (Art. 5 verbotene Praktiken, Hochrisiko, Art. 50 Transparenzpflichten, aktueller Zeitplan inkl. Digital-Omnibus-Verschiebung Juni 2026)
- KI im Arbeitsalltag bei wallPen — praktische Regeln (Kundendaten, menschliche Aufsicht, Transparenz, Verantwortung)
- Verantwortung, Bußgelder (Art. 99) und Ansprechpartner
Inhalte basieren auf öffentlich zugänglichen Quellen (Verordnung (EU) 2024/1689, EU-Kommission, Fachportale) — Quellenliste am Ende von content_data.py (Variable SOURCES). Das ist Awareness-Schulungsmaterial, keine Rechtsberatung. Fristen rund um den "Digital Omnibus on AI" können sich noch ändern.
Bitte vor dem Livegang ausfüllen: In Modul 4 steht als Platzhalter [Bitte internen Ansprechpartner/Datenschutzbeauftragten eintragen] (DE + EN) — im Admin-Bereich unter „Module“ mit dem tatsächlichen Ansprechpartner bei wallPen ersetzen.
Inhalte aktualisieren
Bei einer neuen/leeren Datenbank werden Module und Fragen aus content_data.py automatisch beim ersten Start geladen.
Läuft der Container bereits (z. B. mit alten Platzhaltern aus einem früheren Test), müssen Aenderungen an content_data.py per Skript nachgeladen werden — die Datenbank wird beim Neustart NICHT automatisch überschrieben, damit im Admin-Bereich vorgenommene Aenderungen nicht verloren gehen:
docker compose exec eu-ai-act-schulung python load_real_content.py
Das Skript fragt vor dem Ausführen nochmal nach Bestätigung, ersetzt nur Module und Fragen und lässt bestehende Teilnahmen/Zertifikate unangetastet.
Modul-Grafiken
Jedes Modul hat eine passende, selbst erstellte Grafik (SVG, static/img/module1_de.svg … module4_en.svg) statt eines aus dem Internet gesuchten Bildes — damit gibt es keine Unsicherheit bei Bildrechten/Lizenzen, und die Grafiken passen inhaltlich exakt zum Text (Rollenmodell Anbieter/Betreiber/Mitarbeiter, Risikopyramide der 4 Stufen, 6 Praxis-Regeln als Kachel-Übersicht, Bußgeldstufen als Balkendiagramm) sowie farblich zur wallPen CI.
- Bild pro Modul und Sprache separat hinterlegbar (
image_de/image_enincontent_data.pybzw. im Admin-Bereich unter „Module" → Feld „Bild-Dateiname"). - Eigene/neue Bilder: Datei nach
static/img/legen (Emma per Dateizugriff auf den Server/Container) und den Dateinamen im Admin-Bereich beim jeweiligen Modul eintragen. Kein Bild eingetragen = es wird keine Grafik angezeigt. - Es gibt aktuell kein Upload-Feld im Admin-Bereich, nur die Angabe des Dateinamens einer bereits vorhandenen Datei.
wallPen Corporate Identity
Design (Logo, Farben, Schrift) folgt dem wallPen Styleguide (Stand August 2026):
- Logo: offizielle Wortmarke aus dem Styleguide (
static/img/wallpen_logo.png,wallpen_logo_small.png) - Farben: Yellowish-green
#CEDC00(Pantone 381 C) als Akzent, Anthracite#323E48(RAL 7016) für Text/Buttons - Typografie: Headlines "Barlow Condensed", Fließtext "Barlow" (per Google Fonts eingebunden; im PDF-Zertifikat aktuell Helvetica als Fallback — siehe
fonts/README.txtfür die exakte CI-Schrift im Zertifikat)
Setup / Betrieb (für Emma)
1. Vor dem ersten Start
Die Zugangsdaten stehen NICHT direkt in docker-compose.yml, sondern kommen aus einer lokalen .env-Datei (wird nicht ins Git committet, siehe .gitignore):
cp .env.example .env
Danach in .env die echten Werte eintragen:
ADMIN_PASSWORD=<sicheres Passwort setzen>
SECRET_KEY=<zufälligen langen String setzen, z. B. via `openssl rand -hex 32`>
Ohne gültige .env startet der Container bewusst nicht (Fehlermeldung "ADMIN_PASSWORD fehlt").
2. Bauen und starten
docker compose up -d --build
Die App ist danach unter http://<server-ip>:8080 erreichbar (Port links in docker-compose.yml anpassbar).
3. Daten-Persistenz
Zwei Volumes werden auf den Host gemountet:
./data— SQLite-Datenbank (schulung.db): Module, Fragen, Einstellungen, alle Teilnahme-Ergebnisse../certificates— erzeugte PDF-Zertifikate.
Beide Ordner regelmäßig sichern (Backup), da sie den kompletten Stand der Schulung inkl. Nachweisen enthalten.
4. Logs / Neustart
docker compose logs -f
docker compose restart
5. Update der Inhalte
Alle Inhalte (Module, Fragen, Einstellungen) werden ausschließlich über den Admin-Bereich im Browser gepflegt — kein Codezugriff nötig. Ein Neustart des Containers ist dafür nicht erforderlich.
Technischer Aufbau
- Backend: Python / Flask, WSGI-Server: gunicorn
- Datenhaltung: SQLite (Datei-basiert, keine separate DB nötig)
- PDF-Erzeugung: reportlab
- Kein Frontend-Framework: serverseitig gerenderte HTML-Templates (Jinja2), reines CSS, kein JavaScript-Build nötig
Dateiübersicht:
app.py Flask-Routen (Mitarbeiter-Flow + Admin)
db.py SQLite-Zugriff, Schema, Seed-Logik (nutzt content_data.py)
content_data.py Modul- und Fragentexte (einzige Quelle der Wahrheit für Inhalte)
load_real_content.py Skript zum Nachladen von content_data.py in eine bestehende DB
certificate.py PDF-Zertifikat-Erzeugung
templates/ Jinja2-HTML-Templates
static/css/style.css Styling (wallPen CI-Farben)
static/img/ wallPen-Logo (aus dem Styleguide) + Modul-Grafiken (moduleN_de/en.svg)
fonts/ Optionale CI-Schriftarten für das PDF-Zertifikat (siehe fonts/README.txt)
Dockerfile
docker-compose.yml
.env.example Vorlage für .env (echte Zugangsdaten, nicht im Git)
.gitignore
data/ (Volume) SQLite-DB
certificates/ (Volume) erzeugte PDFs
Bekannte Einschränkungen / offene Punkte
- Admin-Login ist ein einzelnes, gemeinsames Passwort (kein Benutzer-Management) — für 35 Mitarbeiter ausreichend, aber bewusst einfach gehalten.
- PDF-Zertifikat nutzt aktuell Helvetica statt der wallPen-CI-Schrift (Barlow/Barlow Condensed), da keine Schriftdatei mitgeliefert werden konnte. Siehe
fonts/README.txt, um die exakte CI-Schrift zu ergänzen (wird automatisch erkannt, kein Codeänderung nötig). - Ansprechpartner-Platzhalter in Modul 4 muss vor dem Livegang im Admin-Bereich mit echtem Namen/Kontakt ersetzt werden.
- Keine automatische Erinnerung/E-Mail-Versand bei Nichtabschluss — Nachverfolgung erfolgt aktuell manuell über die Admin-Übersicht.