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
This commit is contained in:
86
seed.py
Normal file
86
seed.py
Normal file
@@ -0,0 +1,86 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user