From 6743b1234e8d22f0e8b3b9b289c56546bc04312b Mon Sep 17 00:00:00 2001 From: Team3 Date: Sun, 7 Jun 2026 10:17:21 +0200 Subject: [PATCH] update --- backend/routes.py | 13 +++++++------ frontend/src/components/TopicSidebar.vue | 17 ++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/backend/routes.py b/backend/routes.py index bd235dc..861f3b9 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -46,8 +46,9 @@ async def get_topics(): return db_topics + sorted(derived - set(db_topics)) -# Lernschulden-Regel: höchstens 5 erstellte, aber nicht absolvierte Guides. -# Darüber sind nur Neu-Generierungen bereits erstellter Guides erlaubt. +# Lernschulden-Regel: JE Format (MiniGuide/Guide/FullGuide) höchstens 5 erstellte, +# aber nicht absolvierte Guides. Darüber sind nur Neu-Generierungen bereits +# erstellter Guides erlaubt. Themen, Bausteine und OnePager sind unbegrenzt. MAX_OFFENE_GUIDES = 5 @@ -168,12 +169,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) + # Lernschulden-Regel: neue Guides nur, wenn das Format weniger als 5 offene hat (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()) + stat = (await _formate_stats()).get(req.format, {"erstellt": 0, "absolviert": 0}) + offen = stat["erstellt"] - stat["absolviert"] if offen >= MAX_OFFENE_GUIDES: - raise HTTPException(409, f"Erst Guides absolvieren — maximal {MAX_OFFENE_GUIDES} offene erlaubt ({offen} offen)") + raise HTTPException(409, f"Erst {req.format}s absolvieren — maximal {MAX_OFFENE_GUIDES} offene erlaubt ({offen} offen)") await create_topic(req.topic.strip()) now = datetime.now(timezone.utc).isoformat() guide = { diff --git a/frontend/src/components/TopicSidebar.vue b/frontend/src/components/TopicSidebar.vue index b089cb4..2b23b41 100644 --- a/frontend/src/components/TopicSidebar.vue +++ b/frontend/src/components/TopicSidebar.vue @@ -128,20 +128,19 @@ function handleFormatClick(format) { } } -// Lernschulden-Regel: max. 5 erstellte, aber nicht absolvierte Guides — +// Lernschulden-Regel: JE Format max. 5 erstellte, aber nicht absolvierte Guides — // darüber sind nur Neu-Generierungen bereits erstellter Guides erlaubt. -const offeneGuides = computed(() => { - const f = props.stats?.formate || {} - return ['MiniGuide', 'Guide', 'FullGuide'].reduce( - (sum, k) => sum + ((f[k]?.erstellt ?? 0) - (f[k]?.absolviert ?? 0)), 0, - ) -}) +function offeneGuides(format) { + const f = props.stats?.formate?.[format] + return (f?.erstellt ?? 0) - (f?.absolviert ?? 0) +} function playLock(format) { if (format === 'OnePager') return null if (!props.bausteine.ready) return 'Erst Bausteine erstellen' - if (offeneGuides.value >= 5 && !props.doneByFormat[format]) { - return `Erst Guides absolvieren — ${offeneGuides.value} offen (max. 5)` + const offen = offeneGuides(format) + if (offen >= 5 && !props.doneByFormat[format]) { + return `Erst ${format}s absolvieren — ${offen} offen (max. 5)` } return null }