From cd1c926599d7d1da6d715ee61a1ed6e35827f070 Mon Sep 17 00:00:00 2001 From: team3 Date: Tue, 23 Jun 2026 12:04:17 +0200 Subject: [PATCH] update --- backend/bausteine.py | 20 ++++++++++++-------- backend/routes.py | 6 +++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/backend/bausteine.py b/backend/bausteine.py index ce9b8de..c60e0ab 100644 --- a/backend/bausteine.py +++ b/backend/bausteine.py @@ -251,7 +251,9 @@ def _bausteine_files(topic: str) -> dict: def _alle_slot_dateien(files: dict) -> list[Path]: arbeit = files["arbeit"] # Subbaustein-/Stufen-Slots sind pro Chunk dynamisch — per Glob einsammeln. - dyn = (list(arbeit.glob("subbaustein-*")) + list(arbeit.glob("stufe-*")) + list(arbeit.glob("relevanz-*")) + list(arbeit.glob("frage-muster-*"))) if arbeit.is_dir() else [] + dyn = (list(arbeit.glob("subbaustein-*")) + list(arbeit.glob("stufe-*")) + list(arbeit.glob("relevanz-*")) + + list(arbeit.glob("frage-muster-*")) + list(arbeit.glob("recherche-*")) + list(arbeit.glob("konsolidierung-*")) + + list(arbeit.glob("klaerung*"))) if arbeit.is_dir() else [] return [ *files["recherche"], files["recherche_mapping"], *(p for slots in files["auswahl"].values() for p in slots), @@ -322,16 +324,18 @@ def active_bausteine() -> list[dict]: def reset_bausteine(topic: str) -> None: - files = _bausteine_files(topic) - files["final"].unlink(missing_ok=True) - files["sidecar"].unlink(missing_ok=True) # liegt im Themen-Root, nicht in arbeit/ - files["frage_muster"].unlink(missing_ok=True) # ebenfalls im Themen-Root - quelle_path(topic).unlink(missing_ok=True) - shutil.rmtree(quelle_crawl_dir(topic), ignore_errors=True) # gecrawlte Link-Quelle - shutil.rmtree(files["arbeit"], ignore_errors=True) + """„Löschen": räumt nur die generierten Bausteine weg (Dateien ab Inventar). BEHÄLT + Quelle (quelle.json), Crawl-Ordner und Sichtung. Voller Wipe inkl. Quelle/Crawl nur + über „Thema löschen" (DELETE /topics → rmtree(topic_dir)).""" + _reset_ab_phase(topic, "Inventar") _bausteine_errors.pop(topic, None) +async def reset_bausteine_db(topic: str) -> None: + """DB-Pendant zu reset_bausteine: Inventar…Fragen aus der DB; Coverage/Sichtung + Quelle bleiben.""" + await _reset_db_ab_phase(topic, "Inventar") + + def _phase_idx(label: str) -> int: """Index der groben Phase in der kanonischen Reihenfolge (Quelle=0 … Fragen=5).""" order = [l for l, _ in PHASEN] diff --git a/backend/routes.py b/backend/routes.py index 420ad2b..657eb75 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -17,7 +17,7 @@ from database import ( set_baustein_score, set_baustein_absolviert, set_baustein_verstanden, set_baustein_gemeistert, delete_baustein_daten, delete_topic_pipeline, get_guide_content, delete_guide_content, ) -from bausteine import generate_bausteine, cancel_bausteine, bausteine_status, active_bausteine, reset_bausteine, lade_quelle, lade_uebersicht, subbausteine_titel, lade_frage_muster +from bausteine import generate_bausteine, cancel_bausteine, bausteine_status, active_bausteine, reset_bausteine, reset_bausteine_db, 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 NOETIG, MASTERY, MEISTERN, NIVEAUS, 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_meilensteinen, _zufall_malus from guide import generate_guide, guide_slot_dateien, guide_fertig_step @@ -172,8 +172,8 @@ async def cancel_bausteine_route(topic: str): @router.delete("/bausteine") async def remove_bausteine(topic: str): - reset_bausteine(topic) - await delete_topic_pipeline(topic) + reset_bausteine(topic) # Dateien ab Inventar — Quelle/Crawl bleiben + await reset_bausteine_db(topic) # DB ab Inventar — Coverage/Sichtung + Quelle bleiben return {"ok": True}