"""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).") 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" "**Anleitung speziell fuer unsere geschlossenen Drucker (Deutsch):** " "\n" "Die P2S-Anleitung passt sinngemaess auch fuer P1S/X1C, " "der A1 mini ist ein anderer Drucker (offenes Gehaeuse — Haende weg vom Hotend!).\n\n" "*Weitere Inhalte werden mit Markus 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.") 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() seed_lektionen() seed_einstellungen() print("[seed] Fertig.") if __name__ == "__main__": main()