From 88802360db0d107a13eab1ff65e5780f1b5e11b4 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Mon, 27 Jul 2026 15:57:44 +0200 Subject: [PATCH 1/3] Refactor fuel form --- expenses_manager/expenses/forms.py | 26 ++++++++++++++----------- expenses_manager/expenses/views.py | 31 ++++++++---------------------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index 6f012d6..3d88580 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -62,17 +62,16 @@ class IncomeForm(forms.ModelForm): ) -class FuelEntryForm(forms.Form): - # Expense fields - date = forms.DateField( - widget=forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"}) - ) - amount = forms.DecimalField(max_digits=10, decimal_places=2) - account = forms.ModelChoiceField(queryset=None) - - # Specifics fuel fields - odometer = forms.DecimalField(label="Current kilometers") - liters = forms.DecimalField(max_digits=8, decimal_places=2) +class FuelEntryForm(forms.ModelForm): + odometer = forms.DecimalField(label="Kilómetros actuales") + liters = forms.DecimalField(max_digits=8, decimal_places=2, label="Litros") + + class Meta: + model = Expense + fields = ["date", "amount", "account"] + widgets = { + "date": forms.DateInput(format="%Y-%m-%d", attrs={"type":"date"}), + } def __init__(self, *args, **kwargs): user = kwargs.pop("user") @@ -80,6 +79,11 @@ class FuelEntryForm(forms.Form): if user: self.fields["account"].queryset = user.accounts.filter(active=True) + + if self.instance.pk and hasattr(self.instance, "fuel_data"): + fuel = self.instance.fuel_data + self.fields["odometer"].initial = fuel.odometer + self.fields["liters"].initial = fuel.liters class CategoryForm(forms.ModelForm): diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 3b5cd08..dbc0675 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -712,14 +712,12 @@ def fuel_create(request): owner=request.user, defaults={"name": "Gasolina"}, ) - expense = Expense.objects.create( - owner=request.user, - date=form.cleaned_data["date"], - amount=form.cleaned_data["amount"], - account=form.cleaned_data["account"], - category=category, - description="Repostaje", - ) + + expense = form.save(commit=False) + expense.owner = request.user + expense.category = category + expense.description = "Repostaje" + expense.save() FuelEntry.objects.create( expense=expense, @@ -811,9 +809,7 @@ def fuel_edit(request, pk): if form.is_valid(): # Update expense - expense.date = form.cleaned_data["date"] - expense.amount = form.cleaned_data["amount"] - expense.account = form.cleaned_data["account"] + expense.date = form.save(commit=False) expense.description = "Repostaje" expense.save() @@ -824,18 +820,7 @@ def fuel_edit(request, pk): return _redirect_back(request, "expense_list") else: - fuel = expense.fuel_data - # Initialize manually - form = FuelEntryForm( - initial={ - "date": expense.date, - "amount": expense.amount, - "account": expense.account, - "odometer": fuel.odometer, - "liters": fuel.liters, - }, - user=request.user, - ) + form = FuelEntryForm(instance=expense, user=request.user) next_url = request.POST.get("next") or request.GET.get("next", "") From 166a0b8d189154727c2f4acc49e58b5e8c43f5f3 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Mon, 27 Jul 2026 16:49:37 +0200 Subject: [PATCH 2/3] Minor changes --- expenses_manager/expenses/views.py | 9 +++++++++ expenses_manager/requirements.txt | Bin 784 -> 734 bytes 2 files changed, 9 insertions(+) diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index dbc0675..fb35a91 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -623,6 +623,15 @@ def account_edit(request, pk): @login_required def account_delete(request, pk): + """Delete an account via *soft-delete* (sets active=False). + + Unlike expense_delete, tag_delete or income_delete, which delete the + record for real, accounts are never physically removed: they are + deactivated. Historical expenses and incomes keep their ForeignKey to + the account, so balances and charts for past periods remain correct. + An inactive account disappears from forms (querysets filtered by + active=True) but stays visible and dimmed in the account list. + """ account = get_object_or_404(Account, pk=pk, owner=request.user) if request.method == "POST": diff --git a/expenses_manager/requirements.txt b/expenses_manager/requirements.txt index f46da45ba73ebda74688636f54f04a4bc3e33d09..02e24241c87e385801389cbcf345d28f81440da9 100644 GIT binary patch delta 12 TcmbQhc8_&K0^{aMjCG6v9@GR- delta 58 zcmcb|I)QCN0;6sLLoq`oLo!1?LjglNgAs!+LlQ$KLmopSLlIEi76^?P^cXCG*pR_+ Jb2MW!BLIjl3)cVu From 386fb4dec86ca5a263243e6c30c80b6cd915bb77 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Tue, 28 Jul 2026 12:49:21 +0200 Subject: [PATCH 3/3] added "more information" in the login page --- .../expenses/static/expenses/css/base.css | 5 +++++ .../expenses/templates/registration/login.html | 4 ++++ .../templates/registration/password_help.html | 17 +++++++++++++++++ expenses_manager/expenses/urls.py | 2 ++ 4 files changed, 28 insertions(+) create mode 100644 expenses_manager/expenses/templates/registration/password_help.html diff --git a/expenses_manager/expenses/static/expenses/css/base.css b/expenses_manager/expenses/static/expenses/css/base.css index 5e47648..80a1763 100644 --- a/expenses_manager/expenses/static/expenses/css/base.css +++ b/expenses_manager/expenses/static/expenses/css/base.css @@ -531,4 +531,9 @@ tbody tr:hover { } .progress-fill.danger { background-color: #b71c1c; +} + +.auth-help { + margin-top: 16px; + font-size: 0.9em; } \ No newline at end of file diff --git a/expenses_manager/expenses/templates/registration/login.html b/expenses_manager/expenses/templates/registration/login.html index 0999b6f..f9d3d63 100644 --- a/expenses_manager/expenses/templates/registration/login.html +++ b/expenses_manager/expenses/templates/registration/login.html @@ -10,4 +10,8 @@ +

+ ¿Olvidaste la contraseña? Más información +

+ {% endblock %} \ No newline at end of file diff --git a/expenses_manager/expenses/templates/registration/password_help.html b/expenses_manager/expenses/templates/registration/password_help.html new file mode 100644 index 0000000..1ff3636 --- /dev/null +++ b/expenses_manager/expenses/templates/registration/password_help.html @@ -0,0 +1,17 @@ +{% extends "expenses/base_auth.html" %} + +{% block content %} + +

Recuperar contraseña

+ +

+ Esta aplicación actualmente no envía correos de recuperación automáticos. + Si has olvidado tu contraseña, ponte en contacto con el administrados + para que te asigne una nueva. +

+ +

+ Volver al inicio de sesión. +

+ +{% endblock %} \ No newline at end of file diff --git a/expenses_manager/expenses/urls.py b/expenses_manager/expenses/urls.py index f4e6907..b3e802b 100644 --- a/expenses_manager/expenses/urls.py +++ b/expenses_manager/expenses/urls.py @@ -1,5 +1,6 @@ from . import views from django.urls import path +from django.views.generic import TemplateView urlpatterns = [ path('', views.home, name='home'), @@ -32,4 +33,5 @@ urlpatterns = [ path('goals/new/', views.goal_create, name='goal_create'), path('goals//edit/', views.goal_edit, name='goal_edit'), path('goals//delete/', views.goal_delete, name='goal_delete'), + path('password_help', TemplateView.as_view(template_name="registration/password_help.html"), name="password_help"), ] \ No newline at end of file