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
+
+
+
+ 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
+
+
+
+ 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
+
+
+ {% for tag in tags %}
+ -
+ {{ tag.name }}
+ Editar
+ Eliminar
+
+ {% empty %}
+ - No hay etiquetas
+ {% endfor %}
+
+
+
\ 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}
+ )