feat: improve transactions ordering

This commit is contained in:
Herculino Trotta
2024-11-10 20:45:05 -03:00
parent 05fc4bca7f
commit bc3c3360d0
3 changed files with 18 additions and 24 deletions
+1 -10
View File
@@ -78,16 +78,7 @@ def transactions_list(request, month: int, year: int):
) )
) )
if order == "default": transactions_filtered = default_order(transactions_filtered, order=order)
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")
return render( return render(
request, request,
@@ -1,25 +1,35 @@
from typing import Optional, Literal
from django.db.models import Case, When, Value, IntegerField, QuerySet from django.db.models import Case, When, Value, IntegerField, QuerySet
from django.utils import timezone 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: if extra_ordering is None:
extra_ordering = list() extra_ordering = list()
available_orders = {
"default": ["date_order", "date", "id"],
"newer": ["-date", "id"],
"older": ["date", "id"],
}
today = timezone.localdate(timezone.now()) today = timezone.localdate(timezone.now())
yesterday = today - timezone.timedelta(days=1) yesterday = today - timezone.timedelta(days=1)
tomorrow = 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( return queryset.annotate(
date_order=Case( date_order=Case(
When(date=today, then=Value(0)), When(date=today, then=Value(0)),
When(date=tomorrow, then=Value(1)), When(date=tomorrow, then=Value(1)),
When(date=yesterday, then=Value(2)), When(date=yesterday, then=Value(2)),
When(date__lte=next_7_days, date__gte=tomorrow, then=Value(3)), When(date__gt=tomorrow, then=Value(3)),
When(date__gte=last_7_days, date__lte=today, then=Value(4)), When(date__lt=yesterday, then=Value(4)),
default=Value(5), default=Value(5),
output_field=IntegerField(), output_field=IntegerField(),
) )
).order_by("date_order", *extra_ordering) ).order_by(*available_orders.get(order, list()), *extra_ordering)
+1 -8
View File
@@ -177,14 +177,7 @@ def transaction_all_list(request):
"installment_plan", "installment_plan",
).all() ).all()
if order == "default": transactions = default_order(transactions, order=order)
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")
f = TransactionsFilter(request.GET, queryset=transactions) f = TransactionsFilter(request.GET, queryset=transactions)