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

View File

@@ -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,

View File

@@ -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)

View File

@@ -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)