feat: Kategorien mit Schlagwoertern sind in der Liste erkennbar
Der Schlagwort-Knopf sah bei jeder Kategorie gleich aus - man musste jede einzeln oeffnen, um zu sehen, wo ueberhaupt etwas hinterlegt ist. Belegte Kategorien tragen den Knopf jetzt in Akzentfarbe und mit der Anzahl daneben, der Tooltip nennt sie ausgeschrieben. Die Zahl kommt als keyword_count an der Kategorie mit, ermittelt in einer Aggregat-Abfrage fuer die ganze Liste. Ein Abruf je Kategorie waere dafuer unverhaeltnismaessig gewesen. Gefuellt wird das Feld nur beim Auflisten; beim Anlegen und Aendern einer Gruppe bleibt es bei 0, wo es ohnehin nichts aussagt. Das Popup laedt beim Schliessen die Liste neu, damit die Zahl nach dem Bearbeiten stimmt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
df5bfec331
commit
64cbbc8cf6
@@ -4,6 +4,7 @@ Eine Kategorie erbt ihre Art (Einnahme/Ausgabe) von ihrer Gruppe.
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..database import get_db
|
||||
@@ -33,8 +34,14 @@ FLAG_MIN_APPLIED = 5
|
||||
FLAG_RATIO_DEN = 3 # >= 1/3 (jede dritte)
|
||||
|
||||
|
||||
def group_out(g: CategoryGroup) -> CategoryGroupOut:
|
||||
def group_out(g: CategoryGroup, keyword_counts: dict[int, int] | None = None) -> CategoryGroupOut:
|
||||
cats = sorted(g.categories, key=lambda c: (c.position, c.name.lower()))
|
||||
out = []
|
||||
for c in cats:
|
||||
eintrag = CategoryOut.model_validate(c)
|
||||
if keyword_counts is not None:
|
||||
eintrag.keyword_count = keyword_counts.get(c.id, 0)
|
||||
out.append(eintrag)
|
||||
return CategoryGroupOut(
|
||||
id=g.id,
|
||||
name=g.name,
|
||||
@@ -43,10 +50,29 @@ def group_out(g: CategoryGroup) -> CategoryGroupOut:
|
||||
color=g.color,
|
||||
position=g.position,
|
||||
is_builtin=g.is_builtin,
|
||||
categories=[CategoryOut.model_validate(c) for c in cats],
|
||||
categories=out,
|
||||
)
|
||||
|
||||
|
||||
def _keyword_counts(db: Session, user: User) -> dict[int, int]:
|
||||
"""Schlagwörter je Kategorie – eine Abfrage für die ganze Liste.
|
||||
|
||||
Die Übersicht markiert damit die Kategorien, für die schon etwas hinterlegt
|
||||
ist; ein Abruf je Kategorie waere dafuer unverhaeltnismaessig."""
|
||||
zeilen = (
|
||||
db.query(CategorizationRule.category_id, func.count(CategorizationRule.id))
|
||||
.filter(
|
||||
CategorizationRule.owner_id == user.id,
|
||||
CategorizationRule.source == RuleSource.manual,
|
||||
CategorizationRule.is_transfer.is_(False),
|
||||
CategorizationRule.category_id.isnot(None),
|
||||
)
|
||||
.group_by(CategorizationRule.category_id)
|
||||
.all()
|
||||
)
|
||||
return {cat_id: anzahl for cat_id, anzahl in zeilen}
|
||||
|
||||
|
||||
def _next_position(db: Session, model, **filters) -> int:
|
||||
q = db.query(model.position)
|
||||
for k, v in filters.items():
|
||||
@@ -63,7 +89,8 @@ def list_categories(db: Session = Depends(get_db), user: User = Depends(get_curr
|
||||
.order_by(CategoryGroup.position, CategoryGroup.name)
|
||||
.all()
|
||||
)
|
||||
return [group_out(g) for g in groups]
|
||||
counts = _keyword_counts(db, user)
|
||||
return [group_out(g, counts) for g in groups]
|
||||
|
||||
|
||||
# --- Gruppen ---------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user