Fixed bug. Now it is posible to edit the fuel expense with its form

This commit is contained in:
JKuijperM 2026-04-29 15:20:59 +02:00
parent 13638e74a0
commit ae53ac507e
5 changed files with 107 additions and 28 deletions

View File

@ -74,13 +74,15 @@ class FuelEntryForm(forms.Form):
odometer = forms.DecimalField(label='Current kilometers') odometer = forms.DecimalField(label='Current kilometers')
liters = forms.DecimalField(max_digits=8, decimal_places=2) liters = forms.DecimalField(max_digits=8, decimal_places=2)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
user = kwargs.pop('user') user = kwargs.pop('user')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['account'].queryset = ( if user:
user.accounts.filter(active=True) self.fields['account'].queryset = (
) user.accounts.filter(active=True)
)
class CategoryForm(forms.ModelForm): class CategoryForm(forms.ModelForm):
class Meta: class Meta:

View File

@ -128,7 +128,11 @@
{% endfor %} {% endfor %}
</td> </td>
<td class="table-actions"> <td class="table-actions">
<a href="{% url 'expense_edit' expense.id %}">Editar</a> {% if expense.category.slug == 'gasolina' %}
<a href="{% url 'fuel_edit' expense.id %}">Editar</a>
{% else %}
<a href="{% url 'expense_edit' expense.id %}">Editar</a>
{% endif %}
<a href="{% url 'expense_delete' expense.id %}" class="danger">Eliminar</a> <a href="{% url 'expense_delete' expense.id %}" class="danger">Eliminar</a>
</td> </td>
</tr> </tr>

View File

@ -1,21 +1,37 @@
{% extends "expenses/base.html" %} {% extends "expenses/base.html" %}
{% block title %} {% block title %}
Nuevo repostaje {% if editing %}
Editar repostaje
{% else %}
Nuevo repostaje
{% endif %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<h1> <h1>
Nuevo repostaje {% if editing %}
Editar repostaje
{% else %}
Nuevo repostaje
{% endif %}
</h1> </h1>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<button type="submit"> <button type="submit">
Crear repostaje {% if editing %}
Guardar repostaje
{% else %}
Crear repostaje
{% endif %}
</button> </button>
</form> </form>
<a href="{% url 'fuel_list' %}">Volver</a> {% if editing %}
<a href="{% url 'expense_list' %}">Volver</a>
{% else %}
<a href="{% url 'fuel_list' %}">Volver</a>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -22,5 +22,6 @@ urlpatterns = [
path('incomes/<int:pk>/delete/', views.income_delete, name='income_delete'), path('incomes/<int:pk>/delete/', views.income_delete, name='income_delete'),
path('fuel/', views.fuel_list, name='fuel_list'), path('fuel/', views.fuel_list, name='fuel_list'),
path('fuel/create/', views.fuel_create, name='fuel_create'), path('fuel/create/', views.fuel_create, name='fuel_create'),
path('fuel/<int:pk>/edit/', views.fuel_edit, name='fuel_edit'),
path('categories/', views.category_list, name='category_list'), path('categories/', views.category_list, name='category_list'),
] ]

View File

@ -237,24 +237,32 @@ def expense_create(request):
@login_required @login_required
def expense_edit(request, pk): def expense_edit(request, pk):
# sourcery skip: assign-if-exp, merge-else-if-into-elif
expense = get_object_or_404( expense = get_object_or_404(
Expense, Expense,
pk=pk, pk=pk,
owner=request.user, owner=request.user,
) )
if request.method == "POST": if request.method == "POST":
form = ExpenseForm(request.POST or None, instance=expense, user=request.user) form = ExpenseForm(
request.POST or None,
instance=expense,
user=request.user)
if form.is_valid(): if form.is_valid():
expense = form.save() expense = form.save()
messages.success(request, 'Gasto actualizado') messages.success(request, 'Gasto actualizado')
return redirect('expense_list') return redirect('expense_list')
else: else:
form = ExpenseForm(instance=expense, user=request.user) form = ExpenseForm(instance=expense, user=request.user)
return render( return render(
request, request,
'expenses/expense_form.html', 'expenses/expense_form.html', {
{'active_menu': 'expenses','form': form} 'active_menu': 'expenses',
'form': form,
}
) )
@ -787,33 +795,29 @@ def fuel_create(request):
@login_required @login_required
def fuel_list(request): def fuel_list(request):
selected_year = request.GET.get('year') selected_year = request.GET.get('year')
current_year = datetime.now().year current_year = datetime.now().year
if selected_year: selected_year = int(selected_year) if selected_year else current_year
selected_year = int(selected_year)
else:
selected_year = current_year
fuels = FuelEntry.objects.filter( fuels = FuelEntry.objects.filter(
expense__owner=request.user, expense__owner=request.user,
expense__date__year=selected_year expense__date__year=selected_year
).select_related('expense').order_by('expense__date') ).select_related('expense').order_by('expense__date')
monthly_expenses = ( monthly_expenses = (
fuels fuels
.annotate(month=ExtractMonth('expense__date')) .annotate(month=ExtractMonth('expense__date'))
.values('month') .values('month')
.annotate(total=Sum('expense__amount')) .annotate(total=Sum('expense__amount'))
) )
month_map = {m['month']: float(m['total']) for m in monthly_expenses} month_map = {m['month']: float(m['total']) for m in monthly_expenses}
monthly_data = [ monthly_data = [
month_map.get(month, 0) month_map.get(month, 0)
for month in range(1, 13) for month in range(1, 13)
] ]
year_list = ( year_list = (
FuelEntry.objects.filter( FuelEntry.objects.filter(
expense__owner=request.user,) expense__owner=request.user,)
@ -822,16 +826,16 @@ def fuel_list(request):
.distinct() .distinct()
.order_by('year') .order_by('year')
) )
km_data = [] km_data = []
dates = [] dates = []
for fuel in fuels: for fuel in fuels:
km = fuel.km_since_previous() km = fuel.km_since_previous()
if km: if km:
km_data.append(km) km_data.append(km)
dates.append(fuel.expense.date.strftime('%Y-%m-%d')) dates.append(fuel.expense.date.strftime('%Y-%m-%d'))
return render( request, 'fuel/list.html', return render( request, 'fuel/list.html',
{ {
'active_menu': 'fuel', 'active_menu': 'fuel',
@ -844,6 +848,58 @@ def fuel_list(request):
} }
) )
@login_required
def fuel_edit(request, pk):
expense = get_object_or_404(
Expense,
pk=pk,
owner=request.user,
)
fuel = get_object_or_404(FuelEntry, expense=expense)
if request.method == "POST":
form = FuelEntryForm(
request.POST,
user=request.user
)
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.description = 'Repostaje'
expense.save()
# Update FuelEntry
fuel.odometer = form.cleaned_data['odometer']
fuel.liters = form.cleaned_data['liters']
fuel.save()
return redirect('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
)
return render(
request, 'fuel/create.html', {
'active_menu': 'expenses',
'form': form,
'editing': True,
}
)
@login_required @login_required
def category_list(request): def category_list(request):
categories = Category.objects.filter( categories = Category.objects.filter(