This commit is contained in:
team3
2026-06-24 09:38:20 +02:00
parent d389584b58
commit e985f07696
2 changed files with 25 additions and 10 deletions

View File

@@ -557,6 +557,17 @@ async def count_relevant_subs(topic: str, baustein: str) -> int:
return (await cursor.fetchone())[0]
async def subs_count_roh(topic: str) -> dict[str, int]:
"""Relevante Konsens-Subbausteine je ROHEM Baustein-Titel (= Guide-Section-Titel) eines Themas."""
db = await get_db()
cursor = await db.execute(
"SELECT baustein, COUNT(*) FROM subbausteine WHERE topic = ? "
"AND status = 'konsens' AND relevanz != 'rand' GROUP BY baustein",
(topic,),
)
return {b: n for b, n in await cursor.fetchall()}
async def subs_count_alle() -> dict[tuple[str, str], int]:
"""Relevante Konsens-Subbausteine je (topic, baustein_norm) — für die Stufen-Ableitung."""
db = await get_db()

View File

@@ -14,10 +14,9 @@ from database import (
list_progress, set_progress, delete_progress,
create_element, list_elements, get_element, update_element, delete_element,
list_baustein_progress, get_baustein_progress, set_offene_frage,
set_baustein_score, set_baustein_absolviert, delete_baustein_daten, count_relevant_subs, subs_count_alle,
set_baustein_score, set_baustein_absolviert, delete_baustein_daten, count_relevant_subs, subs_count_roh,
delete_topic_pipeline, delete_quelle, get_guide_content, delete_guide_content,
)
from textkit import _norm_titel
from bausteine import generate_bausteine, cancel_bausteine, bausteine_status, active_bausteine, reset_bausteine, lade_quelle, lade_uebersicht, subbausteine_titel, lade_frage_muster
from elements import generate_element, chat_with_guide, chat_with_element, check_element, style_element, refine_suggestion
from lernen import NIVEAUS, cap_fuer, baustein_chat, baustein_diskussion, baustein_element_anlegen, pruefung_bewertung, pruefung_bewertung_schnell, pruefung_frage, pruefung_frage_variante, quiz_generieren, lueckwahl_generieren, lueckentext_generieren, lueckentext_pruefen, score_berechnen, floor_aus_score, progressiver_malus, stufe_aus_score
@@ -222,17 +221,22 @@ async def get_frage_muster(topic: str, baustein: str):
@router.get("/bausteine/lernstand", response_model=BausteinLernstandResponse)
async def baustein_lernstand(topic: str):
"""Prüfungs-Stand pro Baustein (roher Titel als Key). cap = 2×relevante Subs [10,50]."""
progress = await list_baustein_progress(topic)
caps = await subs_count_alle()
"""Prüfungs-Stand pro Baustein (roher Titel als Key). cap = 2×relevante Subs [10,50]
— für ALLE Bausteine (auch noch nicht geprüfte), damit der cap sofort stimmt."""
progress = {p["baustein"]: p for p in await list_baustein_progress(topic)}
caps = await subs_count_roh(topic)
bausteine = {
p["baustein"]: {
"gute_antworten": p["gute_antworten"],
"streak": p["streak"],
"cap": cap_fuer(caps.get((topic, _norm_titel(p["baustein"])), 0)),
b: {
"gute_antworten": progress[b]["gute_antworten"] if b in progress else 0,
"streak": progress[b]["streak"] if b in progress else 0,
"cap": cap_fuer(n),
}
for p in progress
for b, n in caps.items()
}
# Altbestand-Bausteine mit Prüfung, aber ohne (relevante) Subs → Default-cap.
for b, p in progress.items():
if b not in bausteine:
bausteine[b] = {"gute_antworten": p["gute_antworten"], "streak": p["streak"], "cap": 10}
return {"bausteine": bausteine}