main #30
@ -62,17 +62,16 @@ class IncomeForm(forms.ModelForm):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class FuelEntryForm(forms.Form):
|
class FuelEntryForm(forms.ModelForm):
|
||||||
# Expense fields
|
odometer = forms.DecimalField(label="Kilómetros actuales")
|
||||||
date = forms.DateField(
|
liters = forms.DecimalField(max_digits=8, decimal_places=2, label="Litros")
|
||||||
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
|
class Meta:
|
||||||
odometer = forms.DecimalField(label="Current kilometers")
|
model = Expense
|
||||||
liters = forms.DecimalField(max_digits=8, decimal_places=2)
|
fields = ["date", "amount", "account"]
|
||||||
|
widgets = {
|
||||||
|
"date": forms.DateInput(format="%Y-%m-%d", attrs={"type":"date"}),
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
user = kwargs.pop("user")
|
user = kwargs.pop("user")
|
||||||
@ -81,6 +80,11 @@ class FuelEntryForm(forms.Form):
|
|||||||
if user:
|
if user:
|
||||||
self.fields["account"].queryset = user.accounts.filter(active=True)
|
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 CategoryForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
@ -532,3 +532,8 @@ tbody tr:hover {
|
|||||||
.progress-fill.danger {
|
.progress-fill.danger {
|
||||||
background-color: #b71c1c;
|
background-color: #b71c1c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.auth-help {
|
||||||
|
margin-top: 16px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
@ -10,4 +10,8 @@
|
|||||||
<button type="submit">Entrar</button>
|
<button type="submit">Entrar</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<p class="auth-help">
|
||||||
|
¿Olvidaste la contraseña? <a href="{% url 'password_help' %}">Más información</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -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 %}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
from . import views
|
from . import views
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
from django.views.generic import TemplateView
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.home, name='home'),
|
path('', views.home, name='home'),
|
||||||
@ -32,4 +33,5 @@ urlpatterns = [
|
|||||||
path('goals/new/', views.goal_create, name='goal_create'),
|
path('goals/new/', views.goal_create, name='goal_create'),
|
||||||
path('goals/<int:pk>/edit/', views.goal_edit, name='goal_edit'),
|
path('goals/<int:pk>/edit/', views.goal_edit, name='goal_edit'),
|
||||||
path('goals/<int:pk>/delete/', views.goal_delete, name='goal_delete'),
|
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"),
|
||||||
]
|
]
|
||||||
@ -623,6 +623,15 @@ def account_edit(request, pk):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def account_delete(request, pk):
|
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)
|
account = get_object_or_404(Account, pk=pk, owner=request.user)
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
@ -712,14 +721,12 @@ def fuel_create(request):
|
|||||||
owner=request.user,
|
owner=request.user,
|
||||||
defaults={"name": "Gasolina"},
|
defaults={"name": "Gasolina"},
|
||||||
)
|
)
|
||||||
expense = Expense.objects.create(
|
|
||||||
owner=request.user,
|
expense = form.save(commit=False)
|
||||||
date=form.cleaned_data["date"],
|
expense.owner = request.user
|
||||||
amount=form.cleaned_data["amount"],
|
expense.category = category
|
||||||
account=form.cleaned_data["account"],
|
expense.description = "Repostaje"
|
||||||
category=category,
|
expense.save()
|
||||||
description="Repostaje",
|
|
||||||
)
|
|
||||||
|
|
||||||
FuelEntry.objects.create(
|
FuelEntry.objects.create(
|
||||||
expense=expense,
|
expense=expense,
|
||||||
@ -811,9 +818,7 @@ def fuel_edit(request, pk):
|
|||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
# Update expense
|
# Update expense
|
||||||
expense.date = form.cleaned_data["date"]
|
expense.date = form.save(commit=False)
|
||||||
expense.amount = form.cleaned_data["amount"]
|
|
||||||
expense.account = form.cleaned_data["account"]
|
|
||||||
expense.description = "Repostaje"
|
expense.description = "Repostaje"
|
||||||
expense.save()
|
expense.save()
|
||||||
|
|
||||||
@ -824,18 +829,7 @@ def fuel_edit(request, pk):
|
|||||||
|
|
||||||
return _redirect_back(request, "expense_list")
|
return _redirect_back(request, "expense_list")
|
||||||
else:
|
else:
|
||||||
fuel = expense.fuel_data
|
form = FuelEntryForm(instance=expense, user=request.user)
|
||||||
# Initialize manually
|
|
||||||
form = FuelEntryForm(
|
|
||||||
initial={
|
|
||||||
"date": expense.date,
|
|
||||||
"amount": expense.amount,
|
|
||||||
"account": expense.account,
|
|
||||||
"odometer": fuel.odometer,
|
|
||||||
"liters": fuel.liters,
|
|
||||||
},
|
|
||||||
user=request.user,
|
|
||||||
)
|
|
||||||
|
|
||||||
next_url = request.POST.get("next") or request.GET.get("next", "")
|
next_url = request.POST.get("next") or request.GET.get("next", "")
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user