diff --git a/scipost_django/tasks/forms.py b/scipost_django/tasks/forms.py index e9ad7289850650bc752681b18f70b4dd424f6c3c..80e28a668e8874f82c2a7689566fbe21faca8e18 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 94326dad7031b863083de719b76e933ec49dc15a..d3a9568eb51cadd0a802f5275080f6092a6e7e4c 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(