mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-22 10:46:06 +02:00
Moved sort logic in a class / generalized
This commit is contained in:
parent
6a04704cfb
commit
94738ca06f
2 changed files with 54 additions and 33 deletions
|
@ -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,16 +33,9 @@ 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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ListHeaderAdmin(AuditedAdmin):
|
class ListHeaderAdmin(AuditedAdmin):
|
||||||
|
@ -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)
|
||||||
|
|
41
src/registrar/models/utility/admin_form_order_helper.py
Normal file
41
src/registrar/models/utility/admin_form_order_helper.py
Normal 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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue