From 22563df48a0890d38fb827e73a453c33056dd63b Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 9 Sep 2026 15:36:02 +0200 Subject: [PATCH] Muestra las etiquetas en tabla con su numero de gastos El listado de etiquetas era una lista sin mas, sin forma de saber cuales estaban en uso. Pasa a tabla, en linea con el resto de listados, y anade una columna con el numero de gastos que usa cada etiqueta. El contador se calcula con annotate(Count("expenses")) en la vista, en vez de contar desde la plantilla, para no provocar una query por fila. Incluye tambien el estado vacio, que la lista no tenia. Co-Authored-By: Claude Opus 5 --- .../expenses/templates/expenses/tag_list.html | 43 +++++++++++++------ expenses_manager/expenses/tests/test_tags.py | 23 ++++++++++ expenses_manager/expenses/views.py | 8 +++- 3 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 expenses_manager/expenses/tests/test_tags.py diff --git a/expenses_manager/expenses/templates/expenses/tag_list.html b/expenses_manager/expenses/templates/expenses/tag_list.html index 1291ade..163870f 100644 --- a/expenses_manager/expenses/templates/expenses/tag_list.html +++ b/expenses_manager/expenses/templates/expenses/tag_list.html @@ -5,15 +5,34 @@ ➕ Nueva etiqueta - -{% endblock %} \ No newline at end of file +
+ + + + + + + + + + {% for tag in tags %} + + + + + + {% empty %} + + + + {% endfor %} + +
NombreGastos
{{ tag.name }}{{ tag.expense_count }} + Editar + Eliminar +
+

No hay etiquetas

+ Añade la primera +
+
+{% endblock %} diff --git a/expenses_manager/expenses/tests/test_tags.py b/expenses_manager/expenses/tests/test_tags.py new file mode 100644 index 0000000..f915286 --- /dev/null +++ b/expenses_manager/expenses/tests/test_tags.py @@ -0,0 +1,23 @@ +import pytest +from datetime import date +from decimal import Decimal +from django.urls import reverse +from expenses.models import Expense, Tag + +pytestmark = pytest.mark.django_db + + +def test_tag_list_annotates_expense_usage_count(auth_client, user, account, category): + used = Tag.objects.create(owner=user, name="Usada") + unused = Tag.objects.create(owner=user, name="Sin usar") + + for _ in range(2): + expense = Expense.objects.create( + owner=user, account=account, category=category, amount=Decimal("10"), date=date.today() + ) + expense.tags.add(used) + + response = auth_client.get(reverse('tag_list')) + + counts = {tag.name: tag.expense_count for tag in response.context["tags"]} + assert counts == {"Usada": 2, "Sin usar": 0} diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index f297875..a24ffc9 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -15,7 +15,7 @@ from .forms import ( ) from django.core.paginator import Paginator -from django.db.models import Sum, ProtectedError +from django.db.models import Sum, Count, ProtectedError from django.db.models.functions import ExtractMonth, ExtractYear, ExtractDay from django.contrib.auth.decorators import login_required @@ -635,7 +635,11 @@ def dashboard(request): @login_required def tag_list(request): - tags = Tag.objects.filter(owner=request.user) + tags = ( + Tag.objects.filter(owner=request.user) + .annotate(expense_count=Count("expenses")) + .order_by("name") + ) return render( request, "expenses/tag_list.html", {"active_menu": "settings", "tags": tags}