Drei Aenderungen aus Herbs Feedback:
1. Markus -> Herr Rechmann (60 Treffer in 26 Dateien + DB-Lektionen L2/L3)
Konvention: Herb bleibt 'Herb' (interne Anrede fuer Claude), Markus
wird in SuS-sichtbaren Texten als 'Herr Rechmann' ausgeschrieben.
Wo 'Herb und Markus' stand -> 'Herb und Herr Rechmann'. Wenn das
stilistisch zu uneinheitlich wirkt, koennen wir Herb spaeter auch
in SuS-Texten zu 'Herr Puettmann' umziehen.
2. L3-Titel: 'Customizer — parametrisches 3D-Modell anpassen'
-> 'Mein eigenes 3D-Modell designen'
Begruendung Herb: 'Customizer' + 'parametrisch' wirken abschreckend.
Methode kommt in den Aufgabe-Text, nicht in den Titel.
3. L2-Inhalt komplett geschrieben (~4.8 KB):
- 8-Schritte-Workflow vom Stoebern auf Printables bis zum
Druck-Abholen
- A1-mini-Spezifika klar markiert (offen → nur PLA, 18×18 cm)
- P-Serie-Spezifika fuer groessere Drucke
- Tipps zur Modell-Wahl (klein anfangen, 4+ Sterne)
- Was-tun-wenn-Tabelle bei Druckproblemen
- Lehrer-Eskalations-Pfad: pausieren via Handy-App + Lehrer rufen
Quellenlage: PDF-Anleitung A1 mini im OneDrive + Bambu-Wiki online
waren beide nicht maschinell zugaenglich (pdftoppm fehlt, Wiki
gibt HTTP 402). Workflow basiert auf Standard-Bambu-Studio-Bedienung
+ Konsistenz mit der L1-P2S-Beschreibung. Herb/Herr Rechmann pruefen
die A1-mini-Spezifika beim Lehrer-Test und korrigieren via Inline-Edit
(oder per Migration, wenn Inline-Edit-UI noch nicht live ist).
127 lines
4.9 KiB
Python
127 lines
4.9 KiB
Python
"""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 Herr Rechmann 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 Herr Rechmann erarbeitet (siehe
|
|
docs/lektion-L1-drucker-kennenlernen.md etc.). Hier nur das Geruest,
|
|
damit der Onboarding-Pfad ueberhaupt was zum Anklicken hat.
|
|
"""
|
|
lektionen = [
|
|
# L1-Inhalt wird durch migrations/2026-05-24_l1_inhalt_v2.py auf den
|
|
# endgueltigen Stand gebracht — hier nur Minimal-Stub, damit `seed.py`
|
|
# alleine schon was anzeigt. Bei voller Doku: erst seed.py, dann alle
|
|
# migrations/ ausfuehren.
|
|
(1, "Drucker-Kennenlernen + Sicherheit",
|
|
"*Inhalt kommt mit Migration 2026-05-24_l1_inhalt_v2.py.*",
|
|
"Frag den Lehrer, wenn du irgendwas nicht verstehst — Sicherheit geht vor.",
|
|
"https://wiki.bambulab.com/de/p2s/manual/p2s-intro"),
|
|
# L2/L3: Sprache angepasst per Migration 2026-05-24_lektion_sprache_3d_modell
|
|
# — 'Modell' ist mehrdeutig (Drucker- vs. 3D-Modell), durchgehend 3D-Modell verwendet.
|
|
(2, "3D-Modell aus dem Netz drucken",
|
|
"*Inhalt kommt mit Migration 2026-05-24_lektion_sprache_3d_modell.*",
|
|
"Lizenz-Symbole sind nicht wichtig fuer uns — wir drucken nur fuer uns selbst, geben nichts weiter.",
|
|
"https://www.printables.com/"),
|
|
(3, "Mein eigenes 3D-Modell designen",
|
|
"*Inhalt kommt mit Migration 2026-05-24_lektion_sprache_3d_modell + DB-Update.*",
|
|
"Tipp: Das 3D-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()
|