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.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 registrar.models.utility.admin_form_order_helper import AdminFormOrderHelper, SortingDictInterface
from . import models from . import models
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Used to keep track of how we want to order_by certain FKs # Used to keep track of how we want to order_by certain FKs
foreignkey_orderby_dict = { foreignkey_orderby_dict: [SortingDictInterface] = [
# foreign_key # order_by #foreign_key - order_by
"submitter" : ['first_name', 'last_name'], SortingDictInterface(["submitter", "authorizing_official", "investigator", "creator", "user"], ['first_name', 'last_name']).sorting_dict,
"authorizing_official" : ['first_name', 'last_name'], SortingDictInterface(["domain", "requested_domain"], ["name"]).sorting_dict,
"investigator" : ['first_name', 'last_name'], SortingDictInterface(["domain_application"], ['id']).sorting_dict
"creator" : ['first_name', 'last_name'], ]
"user" : ['first_name', 'last_name'],
"domain" : ['name'],
"requested_domain" : ['name'],
"domain_application" : ['id'],
}
class AuditedAdmin(admin.ModelAdmin): class AuditedAdmin(admin.ModelAdmin):
"""Custom admin to make auditing easier.""" """Custom admin to make auditing easier."""
@ -36,15 +33,8 @@ class AuditedAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs): def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Used to sort dropdown fields alphabetically but can be expanded upon""" """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) 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): def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Used to sort dropdown fields alphabetically but can be expanded upon""" """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) 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): class DomainApplicationAdmin(ListHeaderAdmin):
@ -336,14 +321,9 @@ class DomainApplicationAdmin(ListHeaderAdmin):
# Regular users can only view the specified fields # Regular users can only view the specified fields
return self.readonly_fields return self.readonly_fields
def form_field_order_helper(form_field, db_field):
def formfield_order_helper(form_field, order_by_list): form = AdminFormOrderHelper(foreignkey_orderby_dict)
"""A helper function to order a dropdown field in Django Admin, takes the fields you want to order by as an array""" return form.get_ordered_form_field(form_field, db_field)
# 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
admin.site.register(models.User, MyUserAdmin) admin.site.register(models.User, MyUserAdmin)
admin.site.register(models.UserDomainRole, AuditedAdmin) 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