This commit is contained in:
team3
2026-06-24 09:25:14 +02:00
parent 3b1e84e17d
commit d389584b58
10 changed files with 251 additions and 212 deletions

View File

@@ -11,36 +11,42 @@ Query-Schleifen mehr pro Guide.
import json
from database import list_baustein_levels_all, list_guides, list_progress_all
from database import list_baustein_scores_all, subs_count_alle, list_guides, list_progress_all
from guide import guide_slot_dateien
from lernen import cap_fuer, STUFEN, _schwelle
from paths import bausteine_path, guide_content_path
from textkit import _norm_titel
MAX_OFFENE_GUIDES = 3
# Nur noch EIN Format „Guide" (alle relevanten Bausteine, Prüfung 030). Keine Progression,
# Nur noch EIN Format „Guide" (alle relevanten Bausteine, Prüfung 0cap). Keine Progression,
# keine Vorstufe → der Guide ist immer freischaltbar. „Rest"/FullGuide separat.
VORSTUFE: dict[str, str] = {}
FREISCHALT_LEVEL: dict[str, str] = {}
FORMATE = ("Guide",)
# Geforderter Score je Freischalt-Niveau — nur für die Sperr-Meldung.
# 4 Lernstufen (Floor in % des cap) — Schlüssel aus lernen.STUFEN.
_LEVEL_WORT = {
"absolviert": "absolvieren (alle Bausteine auf 6)",
"verstanden": "verstehen (alle Bausteine auf 12)",
"gemeistert": "meistern (alle Bausteine auf 18)",
"anfaenger": "auf Anfänger (20 %)",
"fortgeschritten": "auf Fortgeschritten (40 %)",
"experte": "auf Experte (60 %)",
"meister": "meistern (100 %)",
}
async def lade_lernstand() -> tuple[list[dict], dict[str, set[str]], dict[str, dict[str, set[str]]]]:
"""Guides + Kapitel-Fortschritt + Bausteine je Meilenstein.
"""Guides + Kapitel-Fortschritt + Bausteine je Stufe.
levels: {"absolviert"/"verstanden"/"gemeistert": {topic → normalisierte Titel}}.
levels: {"anfaenger"/"fortgeschritten"/"experte"/"meister": {topic → normalisierte Titel}}.
Stufe je Baustein wird aus Score + cap (2×relevante Subs) abgeleitet.
"""
roh = await list_baustein_levels_all()
levels = {
stufe: {topic: {_norm_titel(b) for b in titel} for topic, titel in pro_topic.items()}
for stufe, pro_topic in roh.items()
}
scores = await list_baustein_scores_all()
caps = await subs_count_alle()
levels: dict[str, dict[str, set[str]]] = {key: {} for key, _ in STUFEN}
for topic, baustein, score in scores:
cap = cap_fuer(caps.get((topic, _norm_titel(baustein)), 0))
for key, p in STUFEN:
if score >= _schwelle(p, cap):
levels[key].setdefault(topic, set()).add(_norm_titel(baustein))
return await list_guides(), await list_progress_all(), levels
@@ -91,13 +97,13 @@ def ist_level(topic: str, fmt: str, guides: list[dict], progress: dict[str, set[
def ist_absolviert(topic: str, fmt: str, guides: list[dict], progress: dict[str, set[str]], levels: dict[str, dict[str, set[str]]]) -> bool:
"""Alle Bausteine des neuesten fertigen Guides absolviert (≥3)?"""
return ist_level(topic, fmt, guides, progress, levels["absolviert"])
"""Alle Bausteine des neuesten fertigen Guides mindestens Anfänger (≥20 %)?"""
return ist_level(topic, fmt, guides, progress, levels["anfaenger"])
def thema_abgeschlossen(topic: str, guides: list[dict], progress: dict[str, set[str]], levels: dict[str, dict[str, set[str]]]) -> bool:
"""Thema fertig: neuester fertiger Guide, alle Bausteine gemeistert (18)?"""
return ist_level(topic, "Guide", guides, progress, levels["gemeistert"])
"""Thema fertig: neuester fertiger Guide, alle Bausteine auf Meister (100 %)?"""
return ist_level(topic, "Guide", guides, progress, levels["meister"])
def formate_stats(guides: list[dict], progress: dict[str, set[str]], levels: dict[str, dict[str, set[str]]]) -> dict:
@@ -105,7 +111,7 @@ def formate_stats(guides: list[dict], progress: dict[str, set[str]], levels: dic
formate = {}
for fmt in FORMATE:
neueste = _neueste_done(guides, fmt)
absolviert = sum(1 for g in neueste.values() if _guide_alle(g, progress, levels["absolviert"]))
absolviert = sum(1 for g in neueste.values() if _guide_alle(g, progress, levels["anfaenger"]))
formate[fmt] = {"erstellt": len(neueste), "absolviert": absolviert}
return formate