AdminSortFields refactor

This commit is contained in:
zandercymatics 2024-02-14 11:16:13 -07:00
parent f55d5ef934
commit 63438f0193
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7

View file

@ -13,9 +13,12 @@ from django.contrib.contenttypes.models import ContentType
from django.http.response import HttpResponseRedirect from django.http.response import HttpResponseRedirect
from django.urls import reverse from django.urls import reverse
from epplibwrapper.errors import ErrorCode, RegistryError from epplibwrapper.errors import ErrorCode, RegistryError
from registrar.models.contact import Contact
from registrar.models.domain import Domain from registrar.models.domain import Domain
from registrar.models.domain_application import DomainApplication from registrar.models.domain_application import DomainApplication
from registrar.models.draft_domain import DraftDomain
from registrar.models.user import User from registrar.models.user import User
from registrar.models.website import Website
from registrar.utility import csv_export from registrar.utility import csv_export
from registrar.views.utility.mixins import OrderableFieldsMixin from registrar.views.utility.mixins import OrderableFieldsMixin
from django.contrib.admin.views.main import ORDER_VAR from django.contrib.admin.views.main import ORDER_VAR
@ -123,41 +126,39 @@ class CustomLogEntryAdmin(LogEntryAdmin):
class AdminSortFields: class AdminSortFields:
def get_queryset(db_field): _name_sort = Concat("first_name", "last_name", "email")
# Define a mapping of field names to model querysets and sort expressions
sort_mapping = {
"other_contacts": (Contact, _name_sort),
"authorizing_official": (Contact, _name_sort),
"submitter": (Contact, _name_sort),
"current_websites": (Website, "website"),
"alternative_domains": (Website, "website"),
"creator": (User, _name_sort),
"user": (User, _name_sort),
"investigator": (User, _name_sort),
"domain": (Domain, "name"),
"approved_domain": (Domain, "name"),
"requested_domain": (DraftDomain, "name"),
"domain_application": (DomainApplication, "requested_domain__name"),
}
@classmethod
def get_queryset(cls, db_field):
"""This is a helper function for formfield_for_manytomany and formfield_for_foreignkey""" """This is a helper function for formfield_for_manytomany and formfield_for_foreignkey"""
# customize sorting queryset_info = cls.sort_mapping.get(db_field.name, None)
if db_field.name in ( if queryset_info is None:
"other_contacts",
"authorizing_official",
"submitter",
):
# Sort contacts by first_name, then last_name, then email
return models.Contact.objects.all().order_by(Concat("first_name", "last_name", "email"))
elif db_field.name in ("current_websites", "alternative_domains"):
# sort web sites
return models.Website.objects.all().order_by("website")
elif db_field.name in (
"creator",
"user",
"investigator",
):
# Sort users by first_name, then last_name, then email
return models.User.objects.all().order_by(Concat("first_name", "last_name", "email"))
elif db_field.name in (
"domain",
"approved_domain",
):
# Sort domains by name
return models.Domain.objects.all().order_by("name")
elif db_field.name in ("requested_domain",):
# Sort draft domains by name
return models.DraftDomain.objects.all().order_by("name")
elif db_field.name in ("domain_application",):
# Sort domain applications by name
return models.DomainApplication.objects.all().order_by("requested_domain__name")
else:
return None return None
model, order_by = queryset_info
match db_field.name:
case "investigator":
# We should only return users who are staff
return model.objects.filter(is_staff=True).order_by(order_by)
case _:
# If no case is defined, return the default
return model.objects.order_by(order_by)
class AuditedAdmin(admin.ModelAdmin): class AuditedAdmin(admin.ModelAdmin):
"""Custom admin to make auditing easier.""" """Custom admin to make auditing easier."""
@ -922,12 +923,8 @@ class DomainApplicationAdmin(ListHeaderAdmin):
return super().formfield_for_manytomany(db_field, request, **kwargs) return super().formfield_for_manytomany(db_field, request, **kwargs)
def formfield_for_foreignkey(self, db_field, request, **kwargs): def formfield_for_foreignkey(self, db_field, request, **kwargs):
logger.info(f"timing formfield_for_foreignkey -> {db_field.name}")
with Timer() as t: with Timer() as t:
# Removes invalid investigator options from the investigator dropdown print(f"This is the db_field: {db_field}")
if db_field.name == "investigator":
kwargs["queryset"] = User.objects.filter(is_staff=True)
return db_field.formfield(**kwargs)
return super().formfield_for_foreignkey(db_field, request, **kwargs) return super().formfield_for_foreignkey(db_field, request, **kwargs)
# Trigger action when a fieldset is changed # Trigger action when a fieldset is changed