diff --git a/expenses_manager/expenses/templates/categories/list.html b/expenses_manager/expenses/templates/categories/list.html index 0a40561..224af55 100644 --- a/expenses_manager/expenses/templates/categories/list.html +++ b/expenses_manager/expenses/templates/categories/list.html @@ -23,6 +23,7 @@ Categoría + Gastos @@ -30,6 +31,7 @@ {% for row in category_rows %} {{ row.category.name }} + {{ row.category.expense_count }} Editar Eliminar @@ -37,7 +39,7 @@ {% empty %} - +

No hay categorías

diff --git a/expenses_manager/expenses/tests/test_categories.py b/expenses_manager/expenses/tests/test_categories.py index 0d6a6c2..6c9bf74 100644 --- a/expenses_manager/expenses/tests/test_categories.py +++ b/expenses_manager/expenses/tests/test_categories.py @@ -116,3 +116,26 @@ def test_category_list_view_returns_tree_ordered_with_depth(auth_client, user): ("Nieto", 2), ("B raiz", 0), ] + + +def test_category_list_counts_only_direct_expenses(auth_client, user, account): + parent = Category.objects.create(name="Padre", owner=user) + child = Category.objects.create(name="Hija", owner=user, parent=parent) + + Expense.objects.create( + owner=user, account=account, category=parent, + amount=Decimal("10"), date=date.today(), + ) + for _ in range(2): + Expense.objects.create( + owner=user, account=account, category=child, + amount=Decimal("5"), date=date.today(), + ) + + response = auth_client.get(reverse('category_list')) + + counts = { + row["category"].name: row["category"].expense_count + for row in response.context["category_rows"] + } + assert counts == {"Padre": 1, "Hija": 2} diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 4f73831..34d77ac 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -990,7 +990,11 @@ def fuel_delete(request, pk): @login_required def category_list(request): - categories = Category.objects.filter(owner=request.user) + categories = list( + Category.objects.filter(owner=request.user) + .annotate(expense_count=Count("expenses")) + .select_related("parent") + ) if request.method == "POST": form = CategoryForm(request.POST, user=request.user)