P2: Ungelesen-Badge in der Hauptnavigation

- Plugin-Vertrag: nav_badges(user_id) -> {URL: Anzahl}
- Kern-Middleware sammelt Badges pro Anfrage in request.state.nav_badges
- benachrichtigung-Plugin meldet die ungelesene Anzahl
- Rotes Zähler-Badge am Nav-Eintrag (Desktop + Mobil), nur wenn > 0
This commit is contained in:
Flo Hartmann
2026-08-26 09:08:24 +00:00
parent d6ed8fa56e
commit f90c0de46d
4 changed files with 56 additions and 2 deletions

View File

@@ -80,6 +80,19 @@ class BenachrichtigungPlugin(BasePlugin):
def navigation(self) -> list[NavEntry]:
return [NavEntry(label=self.title, url="/benachrichtigung")]
def nav_badges(self, user_id: int) -> dict[str, int]:
"""Nav-Badge: Anzahl ungelesener Benachrichtigungen."""
with self.context.session_factory() as db:
ungelesen = db.scalar(
select(func.count())
.select_from(Benachrichtigung)
.where(
Benachrichtigung.user_id == user_id,
Benachrichtigung.gelesen.is_(False),
)
) or 0
return {"/benachrichtigung": ungelesen} if ungelesen else {}
def dashboard_karten(self, user: User) -> list[DashboardKarte]:
"""Dashboard: Anzahl ungelesener In-App-Benachrichtigungen."""
with self.context.session_factory() as db: