79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
import inspect
|
|
import json
|
|
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.contrib import admin
|
|
from django.contrib.admin.helpers import InlineAdminFormSet
|
|
from django.contrib.admin.options import BaseModelAdmin, InlineModelAdmin
|
|
from django.core import checks
|
|
from js_asset import JS
|
|
|
|
|
|
__all__ = ("OrderableAdmin",)
|
|
|
|
|
|
class OrderableAdmin(BaseModelAdmin):
|
|
ordering_field = "ordering"
|
|
ordering_field_hide_input = False
|
|
extra = 0
|
|
|
|
@property
|
|
def media(self):
|
|
if not isinstance(self, InlineModelAdmin):
|
|
# Editable change list
|
|
context = {
|
|
"field": self.ordering_field,
|
|
"fieldHideInput": self.ordering_field_hide_input,
|
|
}
|
|
else:
|
|
# Find our helper.InlineAdminFormSet so that we may access
|
|
# the formset instance and its prefix
|
|
frame = inspect.currentframe()
|
|
while frame: # pragma: no branch
|
|
helper = frame.f_locals.get("self")
|
|
if isinstance(helper, InlineAdminFormSet):
|
|
break
|
|
frame = frame.f_back
|
|
del frame
|
|
|
|
context = {
|
|
"field": self.ordering_field,
|
|
"fieldHideInput": self.ordering_field_hide_input,
|
|
"prefix": helper.formset.prefix,
|
|
"stacked": isinstance(self, admin.StackedInline),
|
|
"tabular": isinstance(self, admin.TabularInline),
|
|
}
|
|
|
|
return super().media + forms.Media(
|
|
css={
|
|
"all": [
|
|
"admin_ordering/jquery-ui.min.css",
|
|
"admin_ordering/admin_ordering.css",
|
|
]
|
|
},
|
|
js=[
|
|
"admin/js/jquery.init.js",
|
|
"admin_ordering/jquery-ui.min.js",
|
|
JS(
|
|
"admin_ordering/admin_ordering.js",
|
|
{
|
|
"class": "admin-ordering-context",
|
|
"data-context": json.dumps(context),
|
|
},
|
|
),
|
|
],
|
|
)
|
|
|
|
def check(self, **kwargs):
|
|
errors = super().check(**kwargs)
|
|
if "admin_ordering" not in settings.INSTALLED_APPS:
|
|
errors.append(
|
|
checks.Error(
|
|
'"admin_ordering" must be in INSTALLED_APPS.',
|
|
obj=self.__class__,
|
|
id="admin_ordering.E001",
|
|
)
|
|
)
|
|
return errors
|