Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)
Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).
Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md
Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)
Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
2026-05-24 18:56:59 +02:00
|
|
|
"""Initial-Seeds fuer 3d.lehrstun.de.
|
|
|
|
|
|
|
|
|
|
Idempotent — laeuft bei jeder Ausfuehrung ohne Schaden.
|
|
|
|
|
|
|
|
|
|
Aktuell befuellt:
|
|
|
|
|
- ag_mitgliedschaft: 'lessing-3d-ag' (die eine, dauerhafte AG)
|
|
|
|
|
- drucker: 4 Bambu-Lab-Drucker (3 geschlossen + 1 A1 mini)
|
|
|
|
|
|
|
|
|
|
Spaeter folgen Seeds fuer:
|
|
|
|
|
- lektion: L1-L3 Onboarding (Etappe 3, mit Markus inhaltlich)
|
|
|
|
|
- einstellung: Default-Werte fuer Tag-Vorschlaege etc.
|
|
|
|
|
"""
|
|
|
|
|
from database import get_db, init_db
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def seed_ag():
|
|
|
|
|
"""Die eine dauerhafte AG."""
|
|
|
|
|
conn = get_db()
|
|
|
|
|
conn.execute(
|
|
|
|
|
"INSERT OR IGNORE INTO ag_mitgliedschaft (id, name, start_datum, status) "
|
|
|
|
|
"VALUES (?, ?, ?, ?)",
|
|
|
|
|
("lessing-3d-ag", "3D-Druck-AG Lessing-Gymnasium", "2026-05-24", "aktiv")
|
|
|
|
|
)
|
|
|
|
|
conn.commit()
|
|
|
|
|
conn.close()
|
|
|
|
|
print("[seed] AG 'lessing-3d-ag' angelegt (oder bereits da).")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def seed_drucker():
|
|
|
|
|
"""4 Bambu-Lab-Drucker mit Default-Namen.
|
|
|
|
|
|
|
|
|
|
Konkrete Serial-Numbers + Namen werden vom Admin per Inline-Edit gepflegt.
|
|
|
|
|
Hier nur Platzhalter, damit die Drucker-Verwaltung was zum Anzeigen hat.
|
|
|
|
|
"""
|
|
|
|
|
drucker = [
|
|
|
|
|
("P1S #1", "P1S", None, 1, "geschlossenes Gehäuse"),
|
|
|
|
|
("P1S #2", "P1S", None, 1, "geschlossenes Gehäuse"),
|
|
|
|
|
("X1C", "X1C", None, 1, "geschlossen + HEPA"),
|
|
|
|
|
("A1 mini", "A1 mini", None, 0, "offen — Hände weg vom Hotend!"),
|
|
|
|
|
]
|
|
|
|
|
conn = get_db()
|
|
|
|
|
for name, modell, serial, geschlossen, notiz in drucker:
|
|
|
|
|
conn.execute(
|
|
|
|
|
"INSERT OR IGNORE INTO drucker (name, modell, serial_nr, geschlossenes_gehaeuse, aktiv, notiz) "
|
|
|
|
|
"VALUES (?, ?, ?, ?, 1, ?)",
|
|
|
|
|
(name, modell, serial, geschlossen, notiz)
|
|
|
|
|
)
|
|
|
|
|
conn.commit()
|
|
|
|
|
conn.close()
|
|
|
|
|
print(f"[seed] {len(drucker)} Drucker angelegt (oder bereits da).")
|
|
|
|
|
|
|
|
|
|
|
2026-05-24 19:13:19 +02:00
|
|
|
def seed_lektionen():
|
|
|
|
|
"""3 Onboarding-Lektionen mit Platzhalter-Inhalt.
|
|
|
|
|
|
|
|
|
|
Endgueltige Inhalte werden gemeinsam mit Markus erarbeitet (siehe
|
|
|
|
|
docs/lektion-L1-drucker-kennenlernen.md etc.). Hier nur das Geruest,
|
|
|
|
|
damit der Onboarding-Pfad ueberhaupt was zum Anklicken hat.
|
|
|
|
|
"""
|
|
|
|
|
lektionen = [
|
|
|
|
|
(1, "Drucker-Kennenlernen + Sicherheit",
|
|
|
|
|
"**Was du in dieser Lektion lernst:**\n\n"
|
|
|
|
|
"- Welche Drucker wir haben und welcher offen ist (A1 mini — Haende weg vom Hotend!).\n"
|
|
|
|
|
"- Wie du die Bambu Handy App einrichtest.\n"
|
|
|
|
|
"- Welches Material wann erlaubt ist (PLA / PLA+ immer, PETG/ABS nur mit Lehrer).\n"
|
|
|
|
|
"- Dein erster Druck mit einem vorbereiteten Modell.\n\n"
|
|
|
|
|
"**Aufgabe:** Lass dir vom Lehrer ein vorbereitetes Modell zeigen, "
|
|
|
|
|
"starte den Druck, beobachte die ersten Schichten.\n\n"
|
|
|
|
|
"*Inhalt wird mit Markus weiter ausgearbeitet.*",
|
|
|
|
|
"Frag den Lehrer, wenn du irgendwas nicht verstehst — Sicherheit geht vor.",
|
|
|
|
|
"https://bambulab.com/en/support/academy"),
|
|
|
|
|
(2, "Fremdes Modell waehlen + drucken",
|
|
|
|
|
"**Was du in dieser Lektion lernst:**\n\n"
|
|
|
|
|
"- Auf Printables (oder MakerWorld) ein passendes Modell finden.\n"
|
|
|
|
|
"- Das Modell in Bambu Studio importieren und slicen.\n"
|
|
|
|
|
"- Druckzeit + Material abschaetzen, Slot reservieren, drucken.\n\n"
|
|
|
|
|
"**Aufgabe:** Such dir auf Printables ein Modell, das unter 1 h "
|
|
|
|
|
"Druckzeit liegt. Such was, das du wirklich haben willst.\n\n"
|
|
|
|
|
"*Inhalt wird mit Markus weiter ausgearbeitet.*",
|
|
|
|
|
"Lizenz-Symbole sind nicht wichtig fuer uns — wir drucken nur fuer uns selbst, "
|
|
|
|
|
"geben nichts weiter.",
|
|
|
|
|
"https://www.printables.com/"),
|
|
|
|
|
(3, "Customizer / parametrisches Modell",
|
|
|
|
|
"**Was du in dieser Lektion lernst:**\n\n"
|
|
|
|
|
"- Was 'parametrisch' bedeutet (du veraenderst Werte, das Modell passt sich an).\n"
|
|
|
|
|
"- Mit dem MakerWorld-Customizer ein Modell mit deinem eigenen Namen drucken.\n\n"
|
|
|
|
|
"**Aufgabe:** Mach einen Schluesselanhaenger mit deinem Vornamen drauf — "
|
|
|
|
|
"veraendere Schriftart, Groesse, Loch-Position.\n\n"
|
|
|
|
|
"*Inhalt wird mit Markus weiter ausgearbeitet.*",
|
|
|
|
|
"Tipp: Das Modell 'Parametric Name Keychain Creator' auf MakerWorld ist ein guter Einstieg.",
|
|
|
|
|
"https://makerworld.com/en/models/1320280"),
|
|
|
|
|
]
|
|
|
|
|
conn = get_db()
|
|
|
|
|
for nummer, titel, aufgabe_md, tipp_md, extern_link in lektionen:
|
|
|
|
|
conn.execute(
|
|
|
|
|
"INSERT OR IGNORE INTO lektion (nummer, titel, onboarding, aufgabe_md, tipp_md, extern_link, schwierigkeit, aktiv) "
|
|
|
|
|
"VALUES (?, ?, 1, ?, ?, ?, 'leicht', 1)",
|
|
|
|
|
(nummer, titel, aufgabe_md, tipp_md, extern_link)
|
|
|
|
|
)
|
|
|
|
|
conn.commit()
|
|
|
|
|
conn.close()
|
|
|
|
|
print(f"[seed] {len(lektionen)} Onboarding-Lektionen angelegt.")
|
|
|
|
|
|
|
|
|
|
|
Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)
Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).
Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md
Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)
Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
2026-05-24 18:56:59 +02:00
|
|
|
def seed_einstellungen():
|
|
|
|
|
"""Default-Einstellungen, die spaeter inline editiert werden koennen."""
|
|
|
|
|
werte = [
|
|
|
|
|
("tag_vorschlaege",
|
|
|
|
|
"schluesselanhaenger,organizer,werkzeug,spiel,dekoration,ersatzteil,geschenk,figur",
|
|
|
|
|
"text",
|
|
|
|
|
"Komma-getrennte Liste der vorgeschlagenen Tags im Projekt-Katalog"),
|
|
|
|
|
("default_lockout_dauer_min", "15", "integer",
|
|
|
|
|
"Minuten, die ein Profil bei zu vielen Fehlversuchen gesperrt wird"),
|
|
|
|
|
("feedback_widget_aktiv", "0", "integer",
|
|
|
|
|
"Soft-Schalter fuer das Alph-PummelHummel-Widget (kommt in Etappe 9)"),
|
|
|
|
|
]
|
|
|
|
|
conn = get_db()
|
|
|
|
|
for schluessel, wert, typ, beschreibung in werte:
|
|
|
|
|
conn.execute(
|
|
|
|
|
"INSERT OR IGNORE INTO einstellung (schluessel, wert, typ, beschreibung) "
|
|
|
|
|
"VALUES (?, ?, ?, ?)",
|
|
|
|
|
(schluessel, wert, typ, beschreibung)
|
|
|
|
|
)
|
|
|
|
|
conn.commit()
|
|
|
|
|
conn.close()
|
|
|
|
|
print(f"[seed] {len(werte)} Default-Einstellungen angelegt.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
init_db()
|
|
|
|
|
seed_ag()
|
|
|
|
|
seed_drucker()
|
2026-05-24 19:13:19 +02:00
|
|
|
seed_lektionen()
|
Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)
Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).
Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md
Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)
Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
2026-05-24 18:56:59 +02:00
|
|
|
seed_einstellungen()
|
|
|
|
|
print("[seed] Fertig.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|