diff --git a/app/apps/monthly_overview/views.py b/app/apps/monthly_overview/views.py index 85a3e0e..45f5b89 100644 --- a/app/apps/monthly_overview/views.py +++ b/app/apps/monthly_overview/views.py @@ -78,16 +78,7 @@ def transactions_list(request, month: int, year: int): ) ) - if order == "default": - transactions_filtered = default_order( - transactions_filtered, extra_ordering=["date", "id"] - ) - elif order == "newer": - transactions_filtered = transactions_filtered.order_by("-date", "id") - elif order == "older": - transactions_filtered = transactions_filtered.order_by("date", "id") - else: - transactions_filtered = transactions_filtered.order_by("date", "id") + transactions_filtered = default_order(transactions_filtered, order=order) return render( request, diff --git a/app/apps/transactions/utils/default_ordering.py b/app/apps/transactions/utils/default_ordering.py index 614772f..a068afd 100644 --- a/app/apps/transactions/utils/default_ordering.py +++ b/app/apps/transactions/utils/default_ordering.py @@ -1,25 +1,35 @@ +from typing import Optional, Literal + from django.db.models import Case, When, Value, IntegerField, QuerySet from django.utils import timezone -def default_order(queryset: QuerySet, extra_ordering=None) -> QuerySet: +def default_order( + queryset: QuerySet, + order: Literal["default", "newer", "older"], + extra_ordering: Optional[list] = None, +) -> QuerySet: if extra_ordering is None: extra_ordering = list() + available_orders = { + "default": ["date_order", "date", "id"], + "newer": ["-date", "id"], + "older": ["date", "id"], + } + today = timezone.localdate(timezone.now()) yesterday = today - timezone.timedelta(days=1) tomorrow = today + timezone.timedelta(days=1) - last_7_days = today - timezone.timedelta(days=7) - next_7_days = today + timezone.timedelta(days=7) return queryset.annotate( date_order=Case( When(date=today, then=Value(0)), When(date=tomorrow, then=Value(1)), When(date=yesterday, then=Value(2)), - When(date__lte=next_7_days, date__gte=tomorrow, then=Value(3)), - When(date__gte=last_7_days, date__lte=today, then=Value(4)), + When(date__gt=tomorrow, then=Value(3)), + When(date__lt=yesterday, then=Value(4)), default=Value(5), output_field=IntegerField(), ) - ).order_by("date_order", *extra_ordering) + ).order_by(*available_orders.get(order, list()), *extra_ordering) diff --git a/app/apps/transactions/views/transactions.py b/app/apps/transactions/views/transactions.py index e266d2c..dd402f6 100644 --- a/app/apps/transactions/views/transactions.py +++ b/app/apps/transactions/views/transactions.py @@ -177,14 +177,7 @@ def transaction_all_list(request): "installment_plan", ).all() - if order == "default": - transactions = default_order(transactions, extra_ordering=["date", "id"]) - elif order == "newer": - transactions = transactions.order_by("-date", "id") - elif order == "older": - transactions = transactions.order_by("date", "id") - else: - transactions = transactions.order_by("date", "id") + transactions = default_order(transactions, order=order) f = TransactionsFilter(request.GET, queryset=transactions)