update
This commit is contained in:
@@ -719,9 +719,11 @@ async def _generate_onepager(
|
||||
if project:
|
||||
source = _prompt("OnePager-Quelle-Projekt", project=project)
|
||||
recherche_template = "OnePager-Recherche-Projekt"
|
||||
recherche_check_template = "OnePager-Recherche-Check-Projekt"
|
||||
else:
|
||||
source = _prompt("OnePager-Quelle-Thema", topic=topic)
|
||||
recherche_template = "OnePager-Recherche"
|
||||
recherche_check_template = "OnePager-Recherche-Check"
|
||||
|
||||
def recherche_payload(result=None):
|
||||
if not recherche_path.exists():
|
||||
@@ -752,7 +754,7 @@ async def _generate_onepager(
|
||||
await _set_step(guide_id, 1, "Prüfe Recherche…")
|
||||
slots = [{
|
||||
"key": f"{guide_id}-recherche-check",
|
||||
"prompt": _prompt("OnePager-Recherche-Check", topic=topic, recherche=recherche, out_path=recherche_check_path),
|
||||
"prompt": _prompt(recherche_check_template, topic=topic, recherche=recherche, out_path=recherche_check_path),
|
||||
"role": "fast", "capabilities": "files",
|
||||
"payload": (lambda result: _probleme_schema(_json_datei(recherche_check_path))),
|
||||
}]
|
||||
|
||||
@@ -46,17 +46,16 @@ async def get_topics():
|
||||
return db_topics + sorted(derived - set(db_topics))
|
||||
|
||||
|
||||
@router.get("/stats")
|
||||
async def get_stats():
|
||||
"""Tracker: Themen-Anzahl + pro Format erstellt/absolviert (alle Kapitel abgehakt)."""
|
||||
guides = await list_guides()
|
||||
themen = set(await db_list_topics()) | {g["topic"] for g in guides} | set(bausteine_topics())
|
||||
if PROJECTS_DIR.is_dir():
|
||||
themen |= {e.name for e in PROJECTS_DIR.iterdir() if e.is_dir()}
|
||||
# Lernschulden-Regel: höchstens 5 erstellte, aber nicht absolvierte Guides.
|
||||
# Darüber sind nur Neu-Generierungen bereits erstellter Guides erlaubt.
|
||||
MAX_OFFENE_GUIDES = 5
|
||||
|
||||
|
||||
async def _formate_stats() -> dict:
|
||||
"""Pro Format erstellt/absolviert (alle Kapitel abgehakt) — pro Thema zählt nur der neueste fertige Guide."""
|
||||
guides = await list_guides()
|
||||
formate = {}
|
||||
for fmt in ("MiniGuide", "Guide", "FullGuide"):
|
||||
# Pro Thema zählt nur der neueste fertige Guide (Altläufe teilen die Content-Datei)
|
||||
neueste: dict[str, dict] = {}
|
||||
for g in guides:
|
||||
if g["format"] == fmt and g["status"] == "done":
|
||||
@@ -75,7 +74,17 @@ async def get_stats():
|
||||
if titles and titles <= set(await list_progress(g["id"])):
|
||||
absolviert += 1
|
||||
formate[fmt] = {"erstellt": len(neueste), "absolviert": absolviert}
|
||||
return {"themen": len(themen), "formate": formate}
|
||||
return formate
|
||||
|
||||
|
||||
@router.get("/stats")
|
||||
async def get_stats():
|
||||
"""Tracker: Themen-Anzahl + pro Format erstellt/absolviert."""
|
||||
guides = await list_guides()
|
||||
themen = set(await db_list_topics()) | {g["topic"] for g in guides} | set(bausteine_topics())
|
||||
if PROJECTS_DIR.is_dir():
|
||||
themen |= {e.name for e in PROJECTS_DIR.iterdir() if e.is_dir()}
|
||||
return {"themen": len(themen), "formate": await _formate_stats()}
|
||||
|
||||
|
||||
@router.post("/topics")
|
||||
@@ -159,6 +168,12 @@ async def create(req: GuideCreateRequest):
|
||||
for g in await list_guides():
|
||||
if g["topic"] == req.topic.strip() and g["format"] == req.format and g["status"] in ("queued", "generating"):
|
||||
raise HTTPException(409, "Generierung läuft bereits")
|
||||
# Lernschulden-Regel: neue Guides nur, wenn weniger als 5 offene (erstellt, nicht absolviert)
|
||||
if req.format != "OnePager" and not guide_content_path(req.topic.strip(), req.format).exists():
|
||||
formate = await _formate_stats()
|
||||
offen = sum(v["erstellt"] - v["absolviert"] for v in formate.values())
|
||||
if offen >= MAX_OFFENE_GUIDES:
|
||||
raise HTTPException(409, f"Erst Guides absolvieren — maximal {MAX_OFFENE_GUIDES} offene erlaubt ({offen} offen)")
|
||||
await create_topic(req.topic.strip())
|
||||
now = datetime.now(timezone.utc).isoformat()
|
||||
guide = {
|
||||
|
||||
Reference in New Issue
Block a user