mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-07-09 14:25:25 +02:00
feat: improve transactions ordering
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user