diff --git a/expenses_manager/expenses/templates/expenses/expense_list.html b/expenses_manager/expenses/templates/expenses/expense_list.html index 4eae62c..f55ba6c 100644 --- a/expenses_manager/expenses/templates/expenses/expense_list.html +++ b/expenses_manager/expenses/templates/expenses/expense_list.html @@ -45,17 +45,15 @@ - Filtrar por tag: - - Todas - {% for tag in tags %} - - {{ tag.name }} - + Filtrar por tags: + + {% for tag in tags_with_state %} + + {{ tag.name }} {% if tag.active %} ✕{% endif %} + {% endfor %} - + > Filtrar Limpiar @@ -91,10 +89,11 @@ {{ expense.amount }} {% for tag in expense.tags.all %} - - {{ tag.name }} + + {{ tag.name }} + {% empty %} - - + - {% endfor %} diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 373cdb0..51a8a42 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -1,4 +1,5 @@ from datetime import date +from operator import truediv from .forms import ExpenseForm, TagForm from .models import Category, Expense, Tag # from dateutli.relativedelta import relativedelta @@ -114,7 +115,9 @@ def expense_list(request): year = _get_int(request.GET.get('year')) month = _get_int(request.GET.get('month')) category = _get_int(request.GET.get('category')) - tag_id = _get_int(request.GET.get('tag')) + + tag_ids = request.GET.getlist('tag') + tag_ids = [int(t) for t in tag_ids] if year: expenses = expenses.filter(date__year=year) @@ -125,8 +128,10 @@ def expense_list(request): if category: expenses = expenses.filter(category_id=category) - if tag_id: - expenses = expenses.filter(tags__id=tag_id) + if tag_ids: + expenses = expenses.filter(tags__id__in=tag_ids).distinct() + + selected_tags = tag_ids or [] expenses = expenses.order_by('-date') @@ -145,8 +150,28 @@ def expense_list(request): # Pagination paginator = Paginator(expenses, 10) page_number = request.GET.get('page') - page_obj = paginator.get_page(page_number) + page_obj = paginator.get_page(page_number) + # tags with state + tags_with_state = [] + + for tag in Tag.objects.filter(owner=request.user): + if tag.id in selected_tags: + new_tags = [t for t in selected_tags if t != tag.id] + active = True + else: + new_tags = selected_tags + [tag.id] + active = False + + query = '&'.join([f'tag={t}' for t in new_tags]) + + tags_with_state.append({ + 'id': tag.id, + 'name': tag.name, + 'active': active, + 'query': query, + }) + return render ( request, 'expenses/expense_list.html', @@ -162,8 +187,9 @@ def expense_list(request): 'kpi_total': total_amount, 'kpi_count': expense_count, 'kpi_categories': category_count, - 'selected_tag': tag_id, + 'selected_tags': selected_tags, 'tags': Tag.objects.filter(owner=request.user), + 'tags_with_state': tags_with_state, }, )