Added new functionalities to tags

This commit is contained in:
JKuijperM 2026-01-27 20:51:15 +01:00
parent a073bdb142
commit 8cc364879a
7 changed files with 150 additions and 5 deletions

View File

@ -26,3 +26,8 @@ class ExpenseForm(forms.ModelForm):
widgets = { widgets = {
'date': forms.DateInput(attrs={'type': 'date'}), 'date': forms.DateInput(attrs={'type': 'date'}),
} }
class TagForm(forms.ModelForm):
class Meta:
model = Tag
fields = ['name']

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Eliminar etiqueta</h1>
<form method="post">
{% csrf_token %}
<button type="submit">Eliminar</button>
</form>
<a href="{% url 'tag_list' %}">Cancelar</a>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Etiqueta</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Guardar</button>
</form>
<a href="{% url 'tag_list' %}">Volver</a>
</body>
</html>

View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Etiquetas</h1>
<ul>
{% for tag in tags %}
<li>
{{ tag.name }}
<a href="{% url 'tag_edit' tag.id %}">Editar</a>
<a href="{% url 'tag_delete' tag.id %}">Eliminar</a>
</li>
{% empty %}
<li>No hay etiquetas</li>
{% endfor %}
</ul>
</body>
</html>

View File

@ -23,3 +23,16 @@ def test_expense_can_have_tags(client, django_user_model):
assert expense.tags.count() == 1 assert expense.tags.count() == 1
assert tag in expense.tags.all() 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()

View File

@ -8,4 +8,8 @@ urlpatterns = [
path('<int:pk>/edit/', views.expense_edit, name='expense_edit'), path('<int:pk>/edit/', views.expense_edit, name='expense_edit'),
path('<int:pk>/delete/', views.expense_delete, name='expense_delete'), path('<int:pk>/delete/', views.expense_delete, name='expense_delete'),
path('dashboard/', views.dashboard, name='dashboard'), 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/<int:pk>/edit/', views.tag_edit, name='tag_edit'),
path('tags/<int:pk>/delete/', views.tag_delete, name='tag_delete'),
] ]

View File

@ -1,6 +1,6 @@
from datetime import date from datetime import date
from .models import Category, Expense from .forms import ExpenseForm, TagForm
from .forms import ExpenseForm from .models import Category, Expense, Tag
# from dateutli.relativedelta import relativedelta # from dateutli.relativedelta import relativedelta
from django.db.models import Sum from django.db.models import Sum
@ -445,3 +445,75 @@ def dashboard(request):
'category_comparison': category_comparison, 'category_comparison': category_comparison,
'kpi_trend': kpi_trend, 'kpi_trend': kpi_trend,
}) })
@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}
)