Moved sort logic in a class / generalized

This commit is contained in:
zandercymatics 2023-08-10 14:56:16 -06:00
parent 6a04704cfb
commit 94738ca06f
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
2 changed files with 54 additions and 33 deletions

View file

@ -4,22 +4,19 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.contenttypes.models import ContentType
from django.http.response import HttpResponseRedirect
from django.urls import reverse
from registrar.models.utility.admin_form_order_helper import AdminFormOrderHelper, SortingDictInterface
from . import models
logger = logging.getLogger(__name__)
# Used to keep track of how we want to order_by certain FKs
foreignkey_orderby_dict = {
# foreign_key # order_by
"submitter" : ['first_name', 'last_name'],
"authorizing_official" : ['first_name', 'last_name'],
"investigator" : ['first_name', 'last_name'],
"creator" : ['first_name', 'last_name'],
"user" : ['first_name', 'last_name'],
"domain" : ['name'],
"requested_domain" : ['name'],
"domain_application" : ['id'],
}
foreignkey_orderby_dict: [SortingDictInterface] = [
#foreign_key - order_by
SortingDictInterface(["submitter", "authorizing_official", "investigator", "creator", "user"], ['first_name', 'last_name']).sorting_dict,
SortingDictInterface(["domain", "requested_domain"], ["name"]).sorting_dict,
SortingDictInterface(["domain_application"], ['id']).sorting_dict
]
class AuditedAdmin(admin.ModelAdmin):
"""Custom admin to make auditing easier."""
@ -36,15 +33,8 @@ class AuditedAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Used to sort dropdown fields alphabetically but can be expanded upon"""
order_by_list = []
# Determines what we want to sort by, ex: by name
if db_field.name in foreignkey_orderby_dict:
order_by_list = foreignkey_orderby_dict.get(db_field.name)
form_field = super(AuditedAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
return formfield_order_helper(form_field, order_by_list)
return form_field_order_helper(form_field, db_field)
@ -193,13 +183,8 @@ class ContactAdmin(ListHeaderAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Used to sort dropdown fields alphabetically but can be expanded upon"""
order_by_list = []
# Determines what we want to sort by, ex: by name
if db_field.name in foreignkey_orderby_dict:
order_by_list = foreignkey_orderby_dict.get(db_field.name)
form_field = super(ContactAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
return formfield_order_helper(form_field, order_by_list)
return form_field_order_helper(form_field, db_field)
class DomainApplicationAdmin(ListHeaderAdmin):
@ -336,14 +321,9 @@ class DomainApplicationAdmin(ListHeaderAdmin):
# Regular users can only view the specified fields
return self.readonly_fields
def formfield_order_helper(form_field, order_by_list):
"""A helper function to order a dropdown field in Django Admin, takes the fields you want to order by as an array"""
# Only order if we choose to do so
if order_by_list:
form_field.queryset = form_field.queryset.order_by(*order_by_list)
return form_field
def form_field_order_helper(form_field, db_field):
form = AdminFormOrderHelper(foreignkey_orderby_dict)
return form.get_ordered_form_field(form_field, db_field)
admin.site.register(models.User, MyUserAdmin)
admin.site.register(models.UserDomainRole, AuditedAdmin)

View file

@ -0,0 +1,41 @@
import logging
from django.forms import ModelChoiceField
logger = logging.getLogger(__name__)
class SortingDictInterface:
_model_list = {}
_sort_list = []
sorting_dict = {}
def __init__(self, model_list, sort_list):
self.sorting_dict = {
"dropDownSelected": model_list,
"sortBy": sort_list
}
class AdminFormOrderHelper():
"""A helper class to order a dropdown field in Django Admin, takes the fields you want to order by as an array"""
# Used to keep track of how we want to order_by certain FKs
_sorting_dict: [SortingDictInterface] = []
def __init__(self, sort):
self._sorting_dict = sort
def get_ordered_form_field(self, form_field, db_field) -> (ModelChoiceField | None):
"""Orders the queryset for a ModelChoiceField based on the order_by_dict dictionary"""
_order_by_list = []
for item in self._sorting_dict:
drop_down_selected = item.get("dropDownSelected")
sort_by = item.get("sortBy")
if db_field.name in drop_down_selected:
_order_by_list = sort_by
break
# Only order if we choose to do so
if _order_by_list:
form_field.queryset = form_field.queryset.order_by(*_order_by_list)
return form_field