Compare commits

..

5 Commits

Author SHA1 Message Date
956841bb02 Merge pull request 'dev' (#17) from dev into main
Reviewed-on: #17
2026-07-28 11:01:03 +00:00
360e398712 Merge branch 'main' into dev 2026-07-28 11:00:39 +00:00
386fb4dec8 added "more information" in the login page 2026-07-28 12:49:21 +02:00
166a0b8d18 Minor changes 2026-07-27 16:49:37 +02:00
88802360db Refactor fuel form 2026-07-27 15:57:44 +02:00
7 changed files with 60 additions and 34 deletions

View File

@ -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)
class FuelEntryForm(forms.ModelForm):
odometer = forms.DecimalField(label="Kilómetros actuales")
liters = forms.DecimalField(max_digits=8, decimal_places=2, label="Litros")
# Specifics fuel fields
odometer = forms.DecimalField(label="Current kilometers")
liters = forms.DecimalField(max_digits=8, decimal_places=2)
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")
@ -81,6 +80,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):
class Meta:

View File

@ -532,3 +532,8 @@ tbody tr:hover {
.progress-fill.danger {
background-color: #b71c1c;
}
.auth-help {
margin-top: 16px;
font-size: 0.9em;
}

View File

@ -10,4 +10,8 @@
<button type="submit">Entrar</button>
</form>
<p class="auth-help">
¿Olvidaste la contraseña? <a href="{% url 'password_help' %}">Más información</a>
</p>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "expenses/base_auth.html" %}
{% block content %}
<h2>Recuperar contraseña</h2>
<p>
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.
</p>
<p>
<a href="{% url 'login' %}">Volver al inicio de sesión.</a>
</p>
{% endblock %}

View File

@ -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/<int:pk>/edit/', views.goal_edit, name='goal_edit'),
path('goals/<int:pk>/delete/', views.goal_delete, name='goal_delete'),
path('password_help', TemplateView.as_view(template_name="registration/password_help.html"), name="password_help"),
]

View File

@ -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":
@ -712,14 +721,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 +818,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 +829,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", "")

Binary file not shown.