From 234a3402d032c9be800899e07dc9c9986df80df4 Mon Sep 17 00:00:00 2001 From: George Katsikas <giorgakis.katsikas@gmail.com> Date: Thu, 12 Dec 2024 17:33:07 +0100 Subject: [PATCH] add task table property sorting --- scipost_django/tasks/forms.py | 20 +++++++++++++++++++- scipost_django/tasks/tasks/task_kinds.py | 15 +++++++++------ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/scipost_django/tasks/forms.py b/scipost_django/tasks/forms.py index e9ad72898..80e28a668 100644 --- a/scipost_django/tasks/forms.py +++ b/scipost_django/tasks/forms.py @@ -19,7 +19,7 @@ class TaskListSearchForm(forms.Form): label="Order by", choices=[ ("", "-----"), - ("kind__name", "Type"), + ("kind.name", "Kind"), ("title", "Title"), ("due_date", "Due date"), ], @@ -65,6 +65,16 @@ class TaskListSearchForm(forms.Form): self.fields[key].initial = None def search_results(self) -> Collection[Task]: + def recursive_get_attr(obj, attr): + """ + Recursively get attributes from an object. + e.g. recursive_get_attr(obj, "a.b.c") is equivalent to obj.a.b.c + """ + if "." in attr: + first, rest = attr.split(".", 1) + return recursive_get_attr(getattr(obj, first), rest) + return getattr(obj, attr) + search_text = self.cleaned_data.get("search", "") orderby = self.cleaned_data.get("orderby", "") ordering = self.cleaned_data.get("ordering", "-") @@ -75,4 +85,12 @@ class TaskListSearchForm(forms.Form): for task in task_kind.get_tasks(search_text) ] + reverse_ordering = ordering == "-" + if orderby: + tasks = sorted( + tasks, + key=lambda x: recursive_get_attr(x, orderby), + reverse=reverse_ordering, + ) + return tasks diff --git a/scipost_django/tasks/tasks/task_kinds.py b/scipost_django/tasks/tasks/task_kinds.py index 94326dad7..d3a9568eb 100644 --- a/scipost_django/tasks/tasks/task_kinds.py +++ b/scipost_django/tasks/tasks/task_kinds.py @@ -175,12 +175,15 @@ class SendSubsidyInvoiceTask(TaskKind): return ( Subsidy.objects.all() .annotate( - due_date=Subquery( - SubsidyPayment.objects.filter( - subsidy=OuterRef("id"), proof_of_payment__isnull=True - ) - .order_by("date_scheduled") - .values("date_scheduled")[:1] + due_date=Cast( + Subquery( + SubsidyPayment.objects.filter( + subsidy=OuterRef("id"), proof_of_payment__isnull=True + ) + .order_by("date_scheduled") + .values("date_scheduled")[:1] + ), + DateTimeField(), ) ) .filter( -- GitLab