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
87 lines
2.9 KiB
Python
87 lines
2.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 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_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_einstellungen()
|
|
print("[seed] Fertig.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|