sorting in domain growth report

This commit is contained in:
David Kennedy 2024-06-28 00:55:42 -04:00
parent 38125ea97f
commit 59e912b69a
No known key found for this signature in database
GPG key ID: 6528A5386E66B96B

View file

@ -12,6 +12,7 @@ from registrar.models import (
UserDomainRole, UserDomainRole,
) )
from django.db.models import QuerySet, Value, CharField, Count, Q, F from django.db.models import QuerySet, Value, CharField, Count, Q, F
from django.db.models import Case, When, DateField
from django.db.models import ManyToManyField from django.db.models import ManyToManyField
from django.utils import timezone from django.utils import timezone
from django.core.paginator import Paginator from django.core.paginator import Paginator
@ -119,6 +120,13 @@ class BaseExport(ABC):
""" """
return {} return {}
@classmethod
def get_annotations_for_sort(cls):
"""
Get a dict of annotations to make available for order_by clause.
"""
return {}
@classmethod @classmethod
def get_related_table_fields(cls): def get_related_table_fields(cls):
""" """
@ -193,6 +201,7 @@ class BaseExport(ABC):
select_related = cls.get_select_related() select_related = cls.get_select_related()
prefetch_related = cls.get_prefetch_related() prefetch_related = cls.get_prefetch_related()
exclusions = cls.get_exclusions() exclusions = cls.get_exclusions()
annotations_for_sort = cls.get_annotations_for_sort()
filter_conditions = cls.get_filter_conditions(start_date, end_date) filter_conditions = cls.get_filter_conditions(start_date, end_date)
computed_fields = cls.get_computed_fields() computed_fields = cls.get_computed_fields()
related_table_fields = cls.get_related_table_fields() related_table_fields = cls.get_related_table_fields()
@ -202,6 +211,7 @@ class BaseExport(ABC):
.prefetch_related(*prefetch_related) .prefetch_related(*prefetch_related)
.filter(filter_conditions) .filter(filter_conditions)
.exclude(exclusions) .exclude(exclusions)
.annotate(**annotations_for_sort)
.order_by(*sort_fields) .order_by(*sort_fields)
.distinct() .distinct()
) )
@ -742,7 +752,20 @@ class DomainGrowth(DomainExport):
"Deleted", "Deleted",
] ]
# TODO: The below sort is not working properly @classmethod
def get_annotations_for_sort(cls, delimiter=", "):
"""
Get a dict of annotations to make available for sorting.
"""
today = timezone.now().date()
return {
"custom_sort": Case(
When(domain__state=Domain.State.READY, then='domain__first_ready'),
When(domain__state=Domain.State.DELETED, then='domain__deleted'),
default=Value(today), # Default value if no conditions match
output_field=DateField()
)
}
@classmethod @classmethod
def get_sort_fields(cls): def get_sort_fields(cls):
@ -751,8 +774,7 @@ class DomainGrowth(DomainExport):
""" """
return [ return [
'-domain__state', '-domain__state',
'domain__first_ready', 'custom_sort',
'domain__deleted',
'domain__name', 'domain__name',
] ]