1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
from django.contrib import admin
from django import forms
from .settings import preferences_settings
from .registries import global_preferences_registry
from .models import GlobalPreferenceModel
from .forms import GlobalSinglePreferenceForm, SinglePerInstancePreferenceForm
from django.utils.translation import gettext_lazy as _
class SectionFilter(admin.AllValuesFieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
super(SectionFilter, self).__init__(
field, request, params, model, model_admin, field_path
)
parent_model, reverse_path = admin.utils.reverse_field_path(model, field_path)
if model == parent_model:
queryset = model_admin.get_queryset(request)
else:
queryset = parent_model._default_manager.all()
self.registries = []
registry_name_set = set()
for preferenceModel in queryset.distinct():
l = len(registry_name_set)
registry_name_set.add(preferenceModel.registry.__class__.__name__)
if len(registry_name_set) != l:
self.registries.append(preferenceModel.registry)
def choices(self, changelist):
choices = super(SectionFilter, self).choices(changelist)
for choice in choices:
display = choice["display"]
try:
for registry in self.registries:
display = registry.section_objects[display].verbose_name
choice["display"] = display
except (KeyError):
pass
yield choice
class DynamicPreferenceAdmin(admin.ModelAdmin):
list_display = (
"verbose_name",
"name",
"section_name",
"help_text",
"raw_value",
"default_value",
)
fields = ("raw_value", "default_value", "name", "section_name")
readonly_fields = ("name", "section_name", "default_value")
if preferences_settings.ADMIN_ENABLE_CHANGELIST_FORM:
list_editable = ("raw_value",)
search_fields = ["name", "section", "raw_value"]
list_filter = (("section", SectionFilter),)
if preferences_settings.ADMIN_ENABLE_CHANGELIST_FORM:
def get_changelist_form(self, request, **kwargs):
return self.changelist_form
def default_value(self, obj):
return obj.preference.default
default_value.short_description = _("Default Value")
def section_name(self, obj):
try:
return obj.registry.section_objects[obj.section].verbose_name
except KeyError:
pass
return obj.section
section_name.short_description = _("Section Name")
def save_model(self, request, obj, form, change):
pref = form.instance
manager = pref.registry.manager(instance=getattr(obj, "instance", None))
manager.update_db_pref(pref.section, pref.name, form.cleaned_data["raw_value"])
class GlobalPreferenceAdmin(DynamicPreferenceAdmin):
form = GlobalSinglePreferenceForm
changelist_form = GlobalSinglePreferenceForm
def get_queryset(self, *args, **kwargs):
# Instanciate default prefs
manager = global_preferences_registry.manager()
manager.all()
return super(GlobalPreferenceAdmin, self).get_queryset(*args, **kwargs)
admin.site.register(GlobalPreferenceModel, GlobalPreferenceAdmin)
class PerInstancePreferenceAdmin(DynamicPreferenceAdmin):
list_display = ("instance",) + DynamicPreferenceAdmin.list_display
fields = ("instance",) + DynamicPreferenceAdmin.fields
raw_id_fields = ("instance",)
form = SinglePerInstancePreferenceForm
changelist_form = SinglePerInstancePreferenceForm
list_select_related = True
|