From 3422be374c985eec41919c3364519e5c9d8649eb Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Thu, 7 May 2026 15:30:09 +0200 Subject: [PATCH] Refactor dashboard view --- expenses_manager/expenses/views.py | 88 ++++++++---------------------- 1 file changed, 23 insertions(+), 65 deletions(-) diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index 8e3b8d7..3bb69bd 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -292,64 +292,45 @@ def dashboard(request): # ------------------ year = _get_int(request.GET.get("year")) month = _get_int(request.GET.get("month")) - period = request.GET.get("period") - - current_year = date.today().year - + period = request.GET.get("period") account_id = _get_int(request.GET.get("account")) - accounts = Account.objects.filter( - owner=request.user, - active=True, - ) + compare_enabled = request.GET.get("compare") == "1" + today = date.today() + current_year = today.year + + accounts = Account.objects.filter(owner=request.user, active=True) selected_year = year or current_year selected_month = month - compare_enabled = request.GET.get("compare") == "1" - # ------------------ # Queryset base # ----------------- expenses = Expense.objects.filter(owner=request.user) selected_account_obj = None - kpi_balance = None if account_id: expenses = expenses.filter(account_id=account_id) selected_account_obj = accounts.filter(id=account_id).first() - kpi_balance = ( - selected_account_obj.current_balance() if selected_account_obj else 0 - ) + + if period == "this_month": + selected_year, selected_month = today.year, today.month + elif period == "last_month": + selected_year, selected_month = sub_months(today.year, today.month, 1) + elif period == "this_year": + selected_year, selected_month = today.year, None + + if selected_account_obj: + kpi_balance = selected_account_obj.current_balance() else: kpi_balance = sum(account.current_balance() for account in accounts) - today = date.today() - - if period == "this_month": - selected_year = today.year - selected_month = today.month - - elif period == "last_month": - if today.month == 1: - selected_year = today.year - 1 - selected_month = 12 - else: - selected_year = today.year - selected_month = today.month - - elif period == "this_year": - selected_year = today.year - selected_month = None - expenses_filtered = expenses.filter(date__year=selected_year) - if selected_month: expenses_filtered = expenses_filtered.filter(date__month=selected_month) total_amount = expenses_filtered.aggregate(total=Sum("amount"))["total"] or 0 - expense_count = expenses_filtered.count() - category_count = expenses_filtered.values("category").distinct().count() # ------------------ @@ -372,16 +353,8 @@ def dashboard(request): ) month_totals = {row["month"]: float(row["total"]) for row in by_month_qs} - months = list(range(1, 13)) - - by_month = [ - { - "month": m, - "total": month_totals.get(m, 0), - } - for m in months - ] + by_month = [{"month": m, "total": month_totals.get(m, 0)}for m in months] # ------------------ # Availables years @@ -414,17 +387,10 @@ def dashboard(request): if compare_enabled: previous_expenses = Expense.objects.filter(owner=request.user) if account_id: - previous_expenses.filter(account_id=account_id) + previous_expenses = previous_expenses.filter(account_id=account_id) if selected_month: - # Monthly compare - if selected_month == 1: - prev_year = selected_year - 1 - prev_month = 12 - else: - prev_year = selected_year - prev_month = selected_month - 1 - + prev_year, prev_month = sub_months(selected_year, selected_month, 1) previous_expenses = previous_expenses.filter( date__year=prev_year, date__month=prev_month ) @@ -434,13 +400,11 @@ def dashboard(request): previous_expenses = previous_expenses.filter(date__year=prev_year) previous_total = previous_expenses.aggregate(total=Sum("amount"))["total"] or 0 - kpi_difference = total_amount - previous_total if previous_total: percentage = (kpi_difference / previous_total) * 100 - kpi_trend = None if kpi_difference is not None: if kpi_difference > 0: kpi_trend = "up" @@ -448,29 +412,24 @@ def dashboard(request): kpi_trend = "down" else: kpi_trend = "equal" + kpi_difference_abs = abs(kpi_difference) if kpi_difference is not None else None # ------------------ # Previous expenses by category # ------------------ - previous_by_category = previous_expenses.values("category__name").annotate( - total=Sum("amount") - ) + previous_by_category = previous_expenses.values("category__name").annotate(total=Sum("amount")) current_map = {row["category__name"]: row["total"] for row in by_category} - previous_map = { - row["category__name"]: row["total"] for row in previous_by_category - } - - all_categories = set(current_map.keys()) | set(previous_map.keys()) + previous_map = {row["category__name"]: row["total"] for row in previous_by_category} + all_categories = set(current_map) | set(previous_map) category_comparison = [] for category in all_categories: current_total = current_map.get(category, 0) previous_total_cat = previous_map.get(category, 0) - difference = current_total - previous_total_cat category_comparison.append( @@ -490,7 +449,6 @@ def dashboard(request): for account in accounts: monthly_data = account.monthly_balance(selected_year) m_balance = [row["balance"] for row in monthly_data] - accounts_charts.append( { "id": account.id,