Hinweise und Spezialisierung je Version: im Lauf sichtbar, bei „Neue Version“ änderbar

Eingaben liegen jetzt in vN/state.json; alte Versionen ohne eigene
Eingaben nehmen die des Themas. „Neue Version“ öffnet ein Formular mit
den bisherigen Werten, Thema bleibt fest. Zurücksetzen behält die Eingaben.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
team3
2026-10-12 15:29:34 +02:00
parent 7538812cfd
commit 97e465181a
8 changed files with 70 additions and 20 deletions

View File

@@ -32,6 +32,11 @@ class ThemaNeu(BaseModel):
spezialisierung: str = ""
class VersionNeu(BaseModel):
hinweise: str | None = None # None: wie die bisherige Version
spezialisierung: str | None = None
class Position(BaseModel):
abschnitt: str | None = None
lesemodus: str | int | None = None # neu: key des Bildschirms, alt: Index
@@ -104,9 +109,10 @@ async def thema_loeschen(slug: str):
@app.post("/api/themen/{slug}/versionen")
async def version_anlegen(slug: str):
"""Neue Version: gleiche Eingaben, frischer Lauf, ohne Wissen über die Vorgänger."""
key = state.version_anlegen(_thema(slug)["name"])
async def version_anlegen(slug: str, body: VersionNeu | None = None):
"""Neue Version: frischer Lauf ohne Wissen über die Vorgänger; Hinweise und Spezialisierung wahlweise geändert."""
b = body or VersionNeu()
key = state.version_anlegen(_thema(slug)["name"], b.hinweise, b.spezialisierung)
return {"v": int(key.rsplit("/v", 1)[1])}
@@ -115,7 +121,8 @@ async def zustand(slug: str, n: int):
key = _key(slug, n)
t = _thema(slug)
st = state.zustand(key)
return {"slug": slug, "name": t["name"], "version": n, "titel": t["titel"], "hinweise": t.get("hinweise", ""), "spezialisierung": t.get("spezialisierung", ""), **st,
h, sp = state.eingaben(key)
return {"slug": slug, "name": t["name"], "version": n, "titel": t["titel"], **st, "hinweise": h, "spezialisierung": sp,
"deutung": st.get("deutung") or state.deutung(key), "ereignisse": st["ereignisse"][-100:]}

View File

@@ -73,8 +73,9 @@ def _offen(name: str) -> None:
def _thema(name: str) -> tuple[str, str, str]:
"""Titel, Hinweise, Spezialisierung – die Eingaben gelten je Version."""
t = state.thema(name) or {}
return t.get("titel") or name, t.get("hinweise", ""), t.get("spezialisierung", "")
return (t.get("titel") or name, *state.eingaben(name))
def _kapitel(name: str) -> list[dict]:

View File

@@ -55,16 +55,34 @@ def name_von_slug(sl: str) -> str | None:
return next((t["name"] for t in themen() if t.get("slug") == sl), None)
def version_anlegen(name: str) -> str:
n = (versionen(name) or [0])[-1] + 1
key = f"{name}/v{n}"
def version_anlegen(name: str, hinweise: str | None = None, spezialisierung: str | None = None) -> str:
"""Neue Version; ohne Angabe übernimmt sie Hinweise und Spezialisierung der neuesten Version (bzw. des Themas)."""
vs = versionen(name)
alt_h, alt_s = eingaben(f"{name}/v{vs[-1]}") if vs else _eingaben_thema(name)
key = f"{name}/v{(vs or [0])[-1] + 1}"
v = verzeichnis(key)
for u in ("quellen", "buch", "berichte", "arbeit"):
(v / u).mkdir(parents=True)
_schreiben(v / "state.json", leerer_zustand())
st = leerer_zustand()
st["hinweise"] = (alt_h if hinweise is None else hinweise).strip()
st["spezialisierung"] = (alt_s if spezialisierung is None else spezialisierung).strip()
_schreiben(v / "state.json", st)
return key
def _eingaben_thema(name: str) -> tuple[str, str]:
t = thema(name) or {}
return t.get("hinweise", ""), t.get("spezialisierung", "")
def eingaben(key: str) -> tuple[str, str]:
"""Hinweise und Spezialisierung einer Version; alte Versionen ohne eigene Eingaben nehmen die des Themas."""
st = zustand(key)
if "hinweise" in st:
return st["hinweise"], st.get("spezialisierung", "")
return _eingaben_thema(key)
def version_loeschen(key: str) -> None:
_cache.pop(key, None)
shutil.rmtree(verzeichnis(key), ignore_errors=True)
@@ -138,13 +156,14 @@ def loeschen(name: str) -> None:
def zuruecksetzen(key: str) -> None:
v = verzeichnis(key)
h, s = eingaben(key)
_cache.pop(key, None)
for u in ("quellen", "buch", "berichte", "arbeit"):
shutil.rmtree(v / u, ignore_errors=True)
(v / u).mkdir()
for f in ("deutung.json", "log.jsonl", "state.json", "position.json"):
(v / f).unlink(missing_ok=True)
_schreiben(v / "state.json", leerer_zustand())
_schreiben(v / "state.json", {**leerer_zustand(), "hinweise": h, "spezialisierung": s})
def thema(key: str) -> dict | None: