From ae53ac507e5c9a3b6b2025cbf0b93d7aaff8a610 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 29 Apr 2026 15:20:59 +0200 Subject: [PATCH] Fixed bug. Now it is posible to edit the fuel expense with its form --- expenses_manager/expenses/forms.py | 10 +- .../templates/expenses/expense_list.html | 6 +- .../expenses/templates/fuel/create.html | 26 +++++- expenses_manager/expenses/urls.py | 1 + expenses_manager/expenses/views.py | 92 +++++++++++++++---- 5 files changed, 107 insertions(+), 28 deletions(-) diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index e2ee079..0af8c10 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -74,13 +74,15 @@ class FuelEntryForm(forms.Form): odometer = forms.DecimalField(label='Current kilometers') liters = forms.DecimalField(max_digits=8, decimal_places=2) + def __init__(self, *args, **kwargs): user = kwargs.pop('user') super().__init__(*args, **kwargs) - - self.fields['account'].queryset = ( - user.accounts.filter(active=True) - ) + + if user: + self.fields['account'].queryset = ( + user.accounts.filter(active=True) + ) class CategoryForm(forms.ModelForm): class Meta: diff --git a/expenses_manager/expenses/templates/expenses/expense_list.html b/expenses_manager/expenses/templates/expenses/expense_list.html index 8860346..3a88c9e 100644 --- a/expenses_manager/expenses/templates/expenses/expense_list.html +++ b/expenses_manager/expenses/templates/expenses/expense_list.html @@ -128,7 +128,11 @@ {% endfor %} - Editar + {% if expense.category.slug == 'gasolina' %} + Editar + {% else %} + Editar + {% endif %} Eliminar diff --git a/expenses_manager/expenses/templates/fuel/create.html b/expenses_manager/expenses/templates/fuel/create.html index c440728..1f6985e 100644 --- a/expenses_manager/expenses/templates/fuel/create.html +++ b/expenses_manager/expenses/templates/fuel/create.html @@ -1,21 +1,37 @@ {% extends "expenses/base.html" %} {% block title %} - Nuevo repostaje + {% if editing %} + Editar repostaje + {% else %} + Nuevo repostaje + {% endif %} {% endblock %} {% block content %}

- Nuevo repostaje + {% if editing %} + Editar repostaje + {% else %} + Nuevo repostaje + {% endif %}

{% csrf_token %} {{ form.as_p }}
- - Volver + + {% if editing %} + Volver + {% else %} + Volver + {% endif %} {% endblock %} \ No newline at end of file diff --git a/expenses_manager/expenses/urls.py b/expenses_manager/expenses/urls.py index faf11be..7c85916 100644 --- a/expenses_manager/expenses/urls.py +++ b/expenses_manager/expenses/urls.py @@ -22,5 +22,6 @@ urlpatterns = [ path('incomes//delete/', views.income_delete, name='income_delete'), path('fuel/', views.fuel_list, name='fuel_list'), path('fuel/create/', views.fuel_create, name='fuel_create'), + path('fuel//edit/', views.fuel_edit, name='fuel_edit'), path('categories/', views.category_list, name='category_list'), ] \ No newline at end of file diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 7f43952..cd06ce7 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -237,24 +237,32 @@ def expense_create(request): @login_required def expense_edit(request, pk): + # sourcery skip: assign-if-exp, merge-else-if-into-elif expense = get_object_or_404( Expense, pk=pk, owner=request.user, ) + 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(): expense = form.save() messages.success(request, 'Gasto actualizado') return redirect('expense_list') else: - form = ExpenseForm(instance=expense, user=request.user) + form = ExpenseForm(instance=expense, user=request.user) return render( request, - 'expenses/expense_form.html', - {'active_menu': 'expenses','form': form} + 'expenses/expense_form.html', { + 'active_menu': 'expenses', + 'form': form, + } ) @@ -787,33 +795,29 @@ def fuel_create(request): @login_required def fuel_list(request): selected_year = request.GET.get('year') - + current_year = datetime.now().year - - if selected_year: - selected_year = int(selected_year) - else: - selected_year = current_year - + + selected_year = int(selected_year) if selected_year else current_year fuels = FuelEntry.objects.filter( expense__owner=request.user, expense__date__year=selected_year ).select_related('expense').order_by('expense__date') - + monthly_expenses = ( fuels .annotate(month=ExtractMonth('expense__date')) .values('month') .annotate(total=Sum('expense__amount')) ) - + month_map = {m['month']: float(m['total']) for m in monthly_expenses} - + monthly_data = [ month_map.get(month, 0) for month in range(1, 13) ] - + year_list = ( FuelEntry.objects.filter( expense__owner=request.user,) @@ -822,16 +826,16 @@ def fuel_list(request): .distinct() .order_by('year') ) - + km_data = [] dates = [] - + for fuel in fuels: km = fuel.km_since_previous() if km: km_data.append(km) dates.append(fuel.expense.date.strftime('%Y-%m-%d')) - + return render( request, 'fuel/list.html', { '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 def category_list(request): categories = Category.objects.filter(