Sprache: 'Modell' -> '3D-Modell' konsequent durchgesetzt
Herb-Beobachtung: 'Fremdes Modell waehlen + drucken' liest sich
mehrdeutig — kurz dachte er, es waeren fremde Drucker (Prusa) gemeint.
Konvention im Glossar dokumentiert: '3D-Modell' fuer Druckdateien,
'Drucker'/'Druckermodell' fuer die Maschinen.
Geaendert:
- L2-Titel: 'Fremdes Modell waehlen + drucken'
-> '3D-Modell aus dem Netz drucken'
- L3-Titel: 'Customizer / parametrisches Modell'
-> 'Customizer — parametrisches 3D-Modell anpassen'
- L1-aufgabe_md: punktuelle Praezisierungen ('baut ein Modell' etc.)
- L2/L3-aufgabe_md: durchgaengig '3D-Modell'
- Startseite + selbstlern-loop.md + kurskonzept.md: dito
- docs/glossar.md: neue Sektion 'Sprach-Konvention: Modell' mit
Disambiguierungs-Hinweis
Migration migrations/2026-05-24_lektion_sprache_3d_modell.py
(idempotent via Marker SPRACHE_3D_MODELL_V1 in L1, Titel-Vergleich
fuer L2/L3).
seed.py vereinfacht — L1/L2/L3 sind nur noch Minimal-Stubs, die volle
Texte kommen aus den Migrationen. Bei voller Doku-Installation:
seed.py + alle migrations/ laufen lassen.
This commit is contained in:
138
migrations/2026-05-24_lektion_sprache_3d_modell.py
Normal file
138
migrations/2026-05-24_lektion_sprache_3d_modell.py
Normal file
@@ -0,0 +1,138 @@
|
||||
"""Migration 2026-05-24: Sprachliche Klärung 'Modell' → '3D-Modell'.
|
||||
|
||||
Hintergrund: Herb hat angemerkt, dass 'Modell' mehrdeutig ist —
|
||||
sowohl Druckermodell (P2S, A1 mini) als auch 3D-Modell (die STL-Datei).
|
||||
Beim Lesen von L2 ('Fremdes Modell waehlen + drucken') hat er kurz
|
||||
gedacht, es waere von fremden Druckern (Prusa) die Rede.
|
||||
|
||||
Loesung: konsequent '3D-Modell' fuer die Druckdateien, 'Drucker' fuer
|
||||
die Maschinen.
|
||||
|
||||
Aenderungen:
|
||||
- L2-Titel: 'Fremdes Modell waehlen + drucken' -> '3D-Modell aus dem Netz drucken'
|
||||
- L3-Titel: 'Customizer / parametrisches Modell' -> 'Customizer — parametrisches 3D-Modell anpassen'
|
||||
- L1-Text: 'baut ein Modell' -> 'baut ein 3D-Modell' (Schicht fuer Schicht)
|
||||
+ andere mehrdeutige Stellen praezisiert
|
||||
- L1-Text: 'vorbereitetes Modell' -> 'vorbereitetes 3D-Modell'
|
||||
|
||||
Idempotent ueber Marker im jeweiligen Text.
|
||||
"""
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
||||
from database import get_db
|
||||
|
||||
|
||||
MARKER_L1 = "SPRACHE_3D_MODELL_V1"
|
||||
MARKER_L2_TITEL = "3D-Modell aus dem Netz drucken"
|
||||
MARKER_L3_TITEL = "parametrisches 3D-Modell anpassen"
|
||||
|
||||
|
||||
def update_l1(conn):
|
||||
"""L1 aufgabe_md: Praezisierungen 'Modell' -> '3D-Modell' wo es um Druckdateien geht."""
|
||||
row = conn.execute("SELECT aufgabe_md FROM lektion WHERE nummer = 1").fetchone()
|
||||
if not row:
|
||||
return False
|
||||
text = row["aufgabe_md"] or ""
|
||||
if MARKER_L1 in text:
|
||||
return False # schon migriert
|
||||
|
||||
# Konkrete Ersetzungen — gezielt, nicht global, damit "Druckermodell"-Stellen
|
||||
# nicht versehentlich getroffen werden
|
||||
ersetzungen = [
|
||||
("baut ein Modell", "baut ein 3D-Modell"),
|
||||
("entsteht so dein Modell", "entsteht so dein 3D-Modell"),
|
||||
("vorbereitetes Modell drucken", "vorbereitetes 3D-Modell drucken"),
|
||||
("vorbereitetes Modell zeigen", "vorbereitetes 3D-Modell zeigen"),
|
||||
("ein kleines, getestetes Modell", "ein kleines, getestetes 3D-Modell"),
|
||||
# "vorbereitetes Modell" generisch falls noch wo
|
||||
("vorbereitetes Modell", "vorbereitetes 3D-Modell"),
|
||||
]
|
||||
geaendert = text
|
||||
for alt, neu in ersetzungen:
|
||||
geaendert = geaendert.replace(alt, neu)
|
||||
|
||||
# Marker am Ende ergaenzen, damit Re-Run erkennt: schon durch
|
||||
geaendert += f"\n<!-- {MARKER_L1} -->"
|
||||
|
||||
conn.execute("UPDATE lektion SET aufgabe_md = ? WHERE nummer = 1", (geaendert,))
|
||||
return True
|
||||
|
||||
|
||||
def update_l2(conn):
|
||||
"""L2: Titel + Platzhalter-Text praeziser."""
|
||||
row = conn.execute("SELECT titel, aufgabe_md FROM lektion WHERE nummer = 2").fetchone()
|
||||
if not row:
|
||||
return False
|
||||
if row["titel"] == MARKER_L2_TITEL:
|
||||
return False # schon migriert
|
||||
|
||||
neuer_titel = MARKER_L2_TITEL
|
||||
# aufgabe_md neu formulieren — Inhalt bleibt Platzhalter,
|
||||
# aber sprachlich klar mit "3D-Modell"
|
||||
neuer_text = (
|
||||
"**Was du in dieser Lektion lernst:**\n\n"
|
||||
"- Auf **Printables** oder **MakerWorld** ein fertiges 3D-Modell finden, das du drucken willst.\n"
|
||||
"- Das 3D-Modell in **Bambu Studio** importieren und slicen (in Druckanweisungen umwandeln).\n"
|
||||
"- Druckzeit und Materialbedarf abschaetzen.\n"
|
||||
"- Den Druck planen und drucken — auf einem unserer 4 Drucker (welcher gerade frei ist).\n\n"
|
||||
"**Aufgabe:** Such dir ein 3D-Modell aus, das unter 1 h Druckzeit liegt. "
|
||||
"Etwas, das du wirklich haben willst — der Druck dauert mindestens so lange wie ein Schulfilm.\n\n"
|
||||
"*Detaillierter Inhalt wird mit Markus ausgearbeitet — bis dahin: "
|
||||
"fragt den Lehrer, der zeigt euch das Suchen + Slicen direkt am Drucker.*"
|
||||
)
|
||||
conn.execute(
|
||||
"UPDATE lektion SET titel = ?, aufgabe_md = ? WHERE nummer = 2",
|
||||
(neuer_titel, neuer_text)
|
||||
)
|
||||
return True
|
||||
|
||||
|
||||
def update_l3(conn):
|
||||
"""L3: Titel + Platzhalter-Text praeziser."""
|
||||
row = conn.execute("SELECT titel, aufgabe_md FROM lektion WHERE nummer = 3").fetchone()
|
||||
if not row:
|
||||
return False
|
||||
if row["titel"] == MARKER_L3_TITEL:
|
||||
return False # schon migriert
|
||||
|
||||
neuer_titel = MARKER_L3_TITEL
|
||||
neuer_text = (
|
||||
"**Was du in dieser Lektion lernst:**\n\n"
|
||||
"- Was ein **parametrisches 3D-Modell** ist: ein Modell, bei dem du Werte "
|
||||
"(Name, Groesse, Schriftart) veraenderst und das Modell sich automatisch anpasst.\n"
|
||||
"- Den **MakerWorld-Customizer** im Browser bedienen — kein eigenes CAD-Programm noetig.\n"
|
||||
"- Ein Modell mit deinem **eigenen Namen** drucken (z.B. Schluesselanhaenger).\n\n"
|
||||
"**Aufgabe:** Mach einen Schluesselanhaenger mit deinem Vornamen drauf — "
|
||||
"veraendere Schriftart, Groesse, Loch-Position. Dann slicen + drucken.\n\n"
|
||||
"**Tipp:** Das 3D-Modell *Parametric Name Keychain Creator* auf MakerWorld "
|
||||
"ist ein guter Einstieg.\n\n"
|
||||
"*Detaillierter Inhalt wird mit Markus ausgearbeitet.*"
|
||||
)
|
||||
conn.execute(
|
||||
"UPDATE lektion SET titel = ?, aufgabe_md = ? WHERE nummer = 3",
|
||||
(neuer_titel, neuer_text)
|
||||
)
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
conn = get_db()
|
||||
geaendert = []
|
||||
if update_l1(conn):
|
||||
geaendert.append("L1 (Text-Klärungen)")
|
||||
if update_l2(conn):
|
||||
geaendert.append("L2 (Titel + Text neu)")
|
||||
if update_l3(conn):
|
||||
geaendert.append("L3 (Titel + Text neu)")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
if geaendert:
|
||||
print(f"[migration] Sprache 3D-Modell durchgesetzt in: {', '.join(geaendert)}")
|
||||
else:
|
||||
print("[migration] Alle Lektionen bereits auf neuer Sprache — nichts zu tun.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user