From dfedd642897e82b549edeb6cfda493de374c5c79 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Tue, 5 May 2026 18:32:00 +0200 Subject: [PATCH] Created goals and added to home and dashboards --- expenses_manager/expenses/forms.py | 2 +- .../migrations/0009_goal_show_on_home.py | 18 ++++++++++ expenses_manager/expenses/models.py | 1 + .../expenses/static/expenses/css/base.css | 12 +++++++ .../templates/expenses/dashboard.html | 35 +++++++++++++++++++ .../expenses/templates/expenses/home.html | 28 +++++++++++++++ expenses_manager/expenses/views.py | 7 ++++ 7 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 expenses_manager/expenses/migrations/0009_goal_show_on_home.py diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index f711f7f..c2e1b41 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -90,7 +90,7 @@ class CategoryForm(forms.ModelForm): class GoalForm(forms.ModelForm): class Meta: model = Goal - fields = ['name', 'target_amount', 'category'] + fields = ['name', 'target_amount', 'category', "show_on_home"] def __init__(self, *args, **kwargs): user = kwargs.pop('user') diff --git a/expenses_manager/expenses/migrations/0009_goal_show_on_home.py b/expenses_manager/expenses/migrations/0009_goal_show_on_home.py new file mode 100644 index 0000000..0d0d1af --- /dev/null +++ b/expenses_manager/expenses/migrations/0009_goal_show_on_home.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.10 on 2026-05-05 13:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('expenses', '0008_goal'), + ] + + operations = [ + migrations.AddField( + model_name='goal', + name='show_on_home', + field=models.BooleanField(default=False), + ), + ] diff --git a/expenses_manager/expenses/models.py b/expenses_manager/expenses/models.py index 0c87a95..4a8202d 100644 --- a/expenses_manager/expenses/models.py +++ b/expenses_manager/expenses/models.py @@ -248,6 +248,7 @@ class Goal(models.Model): target_amount = models.DecimalField(max_digits=12, decimal_places=2) category = models.ForeignKey("Category", on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) + show_on_home = models.BooleanField(default=False) def progress(self): """ diff --git a/expenses_manager/expenses/static/expenses/css/base.css b/expenses_manager/expenses/static/expenses/css/base.css index d493ab3..8a017ef 100644 --- a/expenses_manager/expenses/static/expenses/css/base.css +++ b/expenses_manager/expenses/static/expenses/css/base.css @@ -390,4 +390,16 @@ tbody tr:hover { .progress-fill.high { background: #2ecc71; +} + +.goals-widget { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 12px; +} + +.goal-card { + padding: 10px; + border-radius: 8px; + background: #f9f9f9; } \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/dashboard.html b/expenses_manager/expenses/templates/expenses/dashboard.html index 3e65de1..35cb59a 100644 --- a/expenses_manager/expenses/templates/expenses/dashboard.html +++ b/expenses_manager/expenses/templates/expenses/dashboard.html @@ -1,5 +1,7 @@ {% extends "expenses/base.html" %} +{% load l10n %} + {% block title %}Dashboard{% endblock %} {% block content %} @@ -214,6 +216,39 @@ {% endif %} + + + + +

Objetivos

+ {% if goals %} +
+ {% for goal in goals %} +
+ {{ goal.name }} + +
+
+
+ + + {{ goal.progress|floatformat:1 }}€ / {{ goal.target_amount|floatformat:1 }}€ ({{ goal.percentage|floatformat:1 }}%) + +
+ {% endfor %} +
+ {% else %} +

No hay objetivos.

+ {% endif %} + + + + diff --git a/expenses_manager/expenses/templates/expenses/home.html b/expenses_manager/expenses/templates/expenses/home.html index 9fd90ff..579718b 100644 --- a/expenses_manager/expenses/templates/expenses/home.html +++ b/expenses_manager/expenses/templates/expenses/home.html @@ -1,5 +1,7 @@ {% extends "expenses/base.html" %} +{% load l10n %} + {% block title %}Home{% endblock %} {% block content %} @@ -60,4 +62,30 @@ +

Objetivos

+ {% if goals %} +
+ {% for goal in goals %} +
+ {{ goal.name }} + +
+
+
+ + + {{ goal.progress|floatformat:1 }}€ / {{ goal.target_amount|floatformat:1 }}€ ({{ goal.percentage|floatformat:1 }}%) + +
+ {% endfor %} +
+ {% else %} +

No tienes objetivos aún.

+ {% endif %} + {% endblock %} diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 5b69948..8e3b8d7 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -93,6 +93,8 @@ def home(request): } ) + goals = Goal.objects.filter(owner=request.user, show_on_home=True) + return render( request, "expenses/home.html", @@ -104,6 +106,7 @@ def home(request): "kpi_categories": kpi_categories, "mini_chart_labels": [x["label"] for x in mini_data], "mini_chart_data": [x["total"] for x in mini_data], + "goals": goals, }, ) @@ -497,6 +500,9 @@ def dashboard(request): } ) + # Goals + goals = Goal.objects.filter(owner=request.user) + # Send the data to the dashboard return render( request, @@ -527,6 +533,7 @@ def dashboard(request): "kpi_balance": kpi_balance, "accounts_charts": accounts_charts, "period": period, + "goals": goals, }, )