From 8cc364879aafa77d355f0172a93f9f9d112de8b9 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Tue, 27 Jan 2026 20:51:15 +0100 Subject: [PATCH] Added new functionalities to tags --- expenses_manager/expenses/forms.py | 7 +- .../expenses/tag_confirm_delete.html | 15 ++++ .../expenses/templates/expenses/tag_form.html | 16 ++++ .../expenses/templates/expenses/tag_list.html | 20 +++++ .../expenses/tests/test_expenses.py | 15 +++- expenses_manager/expenses/urls.py | 4 + expenses_manager/expenses/views.py | 78 ++++++++++++++++++- 7 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 expenses_manager/expenses/templates/expenses/tag_confirm_delete.html create mode 100644 expenses_manager/expenses/templates/expenses/tag_form.html create mode 100644 expenses_manager/expenses/templates/expenses/tag_list.html diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index abe8fc1..3de8441 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -25,4 +25,9 @@ class ExpenseForm(forms.ModelForm): ] widgets = { 'date': forms.DateInput(attrs={'type': 'date'}), - } \ No newline at end of file + } + +class TagForm(forms.ModelForm): + class Meta: + model = Tag + fields = ['name'] \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/tag_confirm_delete.html b/expenses_manager/expenses/templates/expenses/tag_confirm_delete.html new file mode 100644 index 0000000..527beb7 --- /dev/null +++ b/expenses_manager/expenses/templates/expenses/tag_confirm_delete.html @@ -0,0 +1,15 @@ + + + + + +

Eliminar etiqueta

+ +
+ {% csrf_token %} + +
+ + Cancelar + + \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/tag_form.html b/expenses_manager/expenses/templates/expenses/tag_form.html new file mode 100644 index 0000000..3db01a7 --- /dev/null +++ b/expenses_manager/expenses/templates/expenses/tag_form.html @@ -0,0 +1,16 @@ + + + + + +

Etiqueta

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + Volver + + \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/tag_list.html b/expenses_manager/expenses/templates/expenses/tag_list.html new file mode 100644 index 0000000..c03ffa7 --- /dev/null +++ b/expenses_manager/expenses/templates/expenses/tag_list.html @@ -0,0 +1,20 @@ + + + + + +

Etiquetas

+ + + + \ No newline at end of file diff --git a/expenses_manager/expenses/tests/test_expenses.py b/expenses_manager/expenses/tests/test_expenses.py index 53d4151..b84c873 100644 --- a/expenses_manager/expenses/tests/test_expenses.py +++ b/expenses_manager/expenses/tests/test_expenses.py @@ -22,4 +22,17 @@ def test_expense_can_have_tags(client, django_user_model): expense.tags.add(tag) assert expense.tags.count() == 1 - assert tag in expense.tags.all() \ No newline at end of file + assert tag in expense.tags.all() + +def test_user_can_create_tag(client, django_user_model): + user = django_user_model.objects.create_user( + username='test', password='1234' + ) + client.login(username='test', password='1234') + + response = client.post( + reverse('tag_create'), + {'name': 'Food'} + ) + + assert Tag.objects.filter(owner=user, name='Food').exists() diff --git a/expenses_manager/expenses/urls.py b/expenses_manager/expenses/urls.py index 14ef95b..72700b1 100644 --- a/expenses_manager/expenses/urls.py +++ b/expenses_manager/expenses/urls.py @@ -8,4 +8,8 @@ urlpatterns = [ path('/edit/', views.expense_edit, name='expense_edit'), path('/delete/', views.expense_delete, name='expense_delete'), path('dashboard/', views.dashboard, name='dashboard'), + path('tags/', views.tag_list, name='tag_list'), + path('tags/new/', views.tag_create, name='tag_create'), + path('tags//edit/', views.tag_edit, name='tag_edit'), + path('tags//delete/', views.tag_delete, name='tag_delete'), ] \ No newline at end of file diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 30efdc5..a276f76 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -1,6 +1,6 @@ from datetime import date -from .models import Category, Expense -from .forms import ExpenseForm +from .forms import ExpenseForm, TagForm +from .models import Category, Expense, Tag # from dateutli.relativedelta import relativedelta from django.db.models import Sum @@ -444,4 +444,76 @@ def dashboard(request): 'kpi_percentage': percentage, 'category_comparison': category_comparison, 'kpi_trend': kpi_trend, - }) \ No newline at end of file + }) + + +@login_required +def tag_list(request): + tags = Tag.objects.filter(owner=request.user) + + return render( + request, + 'expenses/tag_list.html', + {'tags':tags} + ) + + +@login_required +def tag_create(request): + if request.method == 'POST': + form = TagForm(request.POST) + if form.is_valid(): + tag = form.save(commit=False) + tag.owner = request.user + tag.save() + return redirect('tag_list') + else: + form = TagForm() + + return render( + request, + 'expenses/tag_form.html', + {'form': form} + ) + + +@login_required +def tag_edit(request, pk): + tag = get_object_or_404( + Tag, + pk=pk, + owner=request.user + ) + + if request.method == 'POST': + form = TagForm(request.POST, instance=tag) + if form.is_valid(): + form.save() + return redirect('tag_list') + else: + form = TagForm(instance=tag) + + return render( + request, + 'expenses/tag_form.html', + {'form': form} + ) + + +@login_required +def tag_delete(request, pk): + tag = get_object_or_404( + Tag, + pk=pk, + owner=request.user + ) + + if request.method == 'POST': + tag.delete() + return redirect('tag_list') + + return render( + request, + 'expenses/tag_confirm_delete.html', + {'tag': tag} + )