django-categories/categories/admin.py

107 lines
3.4 KiB
Python
Raw Permalink Normal View History

"""Admin interface classes."""
2009-07-03 00:23:08 +00:00
from django import forms
from django.contrib import admin
2021-12-16 11:26:40 +00:00
from django.utils.translation import gettext_lazy as _
from .base import CategoryBaseAdmin, CategoryBaseAdminForm
from .genericcollection import GenericCollectionTabularInline
from .models import Category
from .settings import JAVASCRIPT_URL, MODEL_REGISTRY, REGISTER_ADMIN, RELATION_MODELS
2009-07-03 00:23:08 +00:00
class NullTreeNodeChoiceField(forms.ModelChoiceField):
"""A ModelChoiceField for tree nodes."""
def __init__(self, level_indicator="---", *args, **kwargs):
self.level_indicator = level_indicator
super(NullTreeNodeChoiceField, self).__init__(*args, **kwargs)
def label_from_instance(self, obj) -> str:
"""
Creates labels which represent the tree level of each node when generating option labels.
"""
return "%s %s" % (self.level_indicator * getattr(obj, obj._mptt_meta.level_attr), obj)
2016-11-14 18:29:05 +00:00
if RELATION_MODELS:
from .models import CategoryRelation
class InlineCategoryRelation(GenericCollectionTabularInline):
"""The inline admin panel for category relations."""
model = CategoryRelation
class CategoryAdminForm(CategoryBaseAdminForm):
"""The form for a category in the admin."""
class Meta:
model = Category
fields = "__all__"
2012-07-12 23:24:55 +00:00
def clean_alternate_title(self) -> str:
"""Return either the name or alternate title for the category."""
if self.instance is None or not self.cleaned_data["alternate_title"]:
return self.cleaned_data["name"]
else:
return self.cleaned_data["alternate_title"]
2009-07-03 00:23:08 +00:00
class CategoryAdmin(CategoryBaseAdmin):
"""Admin for categories."""
form = CategoryAdminForm
list_display = ("name", "alternate_title", "active")
fieldsets = (
(None, {"fields": ("parent", "name", "thumbnail", "active")}),
(
_("Meta Data"),
{
"fields": ("alternate_title", "alternate_url", "description", "meta_keywords", "meta_extra"),
"classes": ("collapse",),
},
),
(
_("Advanced"),
{
"fields": ("order", "slug"),
"classes": ("collapse",),
},
),
)
autocomplete_fields = ("parent",)
2012-07-12 23:24:55 +00:00
if RELATION_MODELS:
inlines = [
InlineCategoryRelation,
]
2012-07-12 23:24:55 +00:00
class Media:
js = (JAVASCRIPT_URL + "genericcollections.js",)
2009-07-03 00:23:08 +00:00
2016-11-14 18:29:05 +00:00
2012-05-16 19:59:58 +00:00
if REGISTER_ADMIN:
2012-05-16 13:41:10 +00:00
admin.site.register(Category, CategoryAdmin)
2016-02-10 17:47:30 +00:00
for model, modeladmin in list(admin.site._registry.items()):
if model in list(MODEL_REGISTRY.values()) and modeladmin.fieldsets:
fieldsets = getattr(modeladmin, "fieldsets", ())
fields = [cat.split(".")[2] for cat in MODEL_REGISTRY if MODEL_REGISTRY[cat] == model]
# check each field to see if already defined
for cat in fields:
2011-08-19 14:04:39 +00:00
for k, v in fieldsets:
if cat in v["fields"]:
fields.remove(cat)
# if there are any fields left, add them under the categories fieldset
if len(fields) > 0:
admin.site.unregister(model)
admin.site.register(
model,
type(
"newadmin",
(modeladmin.__class__,),
{"fieldsets": fieldsets + (("Categories", {"fields": fields}),)},
),
)