django-admin-ordering 0.18.0__tar.gz → 0.18.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/PKG-INFO +8 -11
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/README.rst +7 -10
- django_admin_ordering-0.18.2/admin_ordering/__init__.py +1 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/admin.py +10 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/static/admin_ordering/admin_ordering.js +37 -38
- django_admin_ordering-0.18.0/admin_ordering/__init__.py +0 -1
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/.gitignore +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/AUTHORS +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/LICENSE +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/locale/de/LC_MESSAGES/django.mo +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/locale/de/LC_MESSAGES/django.po +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/models.py +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/static/admin_ordering/admin_ordering-icon.svg +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/static/admin_ordering/admin_ordering.css +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/static/admin_ordering/jquery-ui.min.css +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/admin_ordering/static/admin_ordering/jquery-ui.min.js +0 -0
- {django_admin_ordering-0.18.0 → django_admin_ordering-0.18.2}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: django-admin-ordering
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.2
|
|
4
4
|
Summary: Orderable change lists and inlines done right^Wsimple
|
|
5
5
|
Project-URL: Homepage, https://github.com/matthiask/django-admin-ordering/
|
|
6
6
|
Author-email: Matthias Kestenholz <mk@feinheit.ch>
|
|
@@ -66,7 +66,7 @@ attribute is set to the correct value:
|
|
|
66
66
|
class MyModel(OrderableModel):
|
|
67
67
|
# ...
|
|
68
68
|
|
|
69
|
-
class Meta(OrderableModel):
|
|
69
|
+
class Meta(OrderableModel.Meta):
|
|
70
70
|
# ...
|
|
71
71
|
|
|
72
72
|
|
|
@@ -80,16 +80,16 @@ Orderable change lists
|
|
|
80
80
|
@admin.register(MyModel)
|
|
81
81
|
class MyModelAdmin(OrderableAdmin, admin.ModelAdmin):
|
|
82
82
|
# The field used for ordering. Prepend a minus for reverse
|
|
83
|
-
# ordering: "-
|
|
84
|
-
ordering_field = "
|
|
83
|
+
# ordering: "-ordering"
|
|
84
|
+
ordering_field = "ordering" # The default.
|
|
85
85
|
|
|
86
86
|
# You may optionally hide the ordering field in the changelist:
|
|
87
87
|
# ordering_field_hide_input = False
|
|
88
88
|
|
|
89
89
|
# The ordering field must be included both in list_display and
|
|
90
90
|
# list_editable:
|
|
91
|
-
list_display = ["name", "
|
|
92
|
-
list_editable = ["
|
|
91
|
+
list_display = ["name", "ordering"]
|
|
92
|
+
list_editable = ["ordering"]
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
Orderable inlines
|
|
@@ -102,8 +102,8 @@ Orderable inlines
|
|
|
102
102
|
class MyModelTabularInline(OrderableAdmin, admin.TabularInline):
|
|
103
103
|
model = MyModel
|
|
104
104
|
|
|
105
|
-
# Same as above; "-
|
|
106
|
-
ordering_field = "
|
|
105
|
+
# Same as above; "-ordering" is also allowed here:
|
|
106
|
+
ordering_field = "ordering"
|
|
107
107
|
# ordering_field_hide_input = False
|
|
108
108
|
|
|
109
109
|
``OrderableAdmin`` comes with a default of ``extra = 0`` (no extra
|
|
@@ -115,9 +115,6 @@ inlines just because you wanted to change the ordering.
|
|
|
115
115
|
Limitations
|
|
116
116
|
===========
|
|
117
117
|
|
|
118
|
-
- Starting with Django 1.9 newly created inlines are automatically
|
|
119
|
-
assigned a good ordering value. Earlier versions do not support the
|
|
120
|
-
required ``formset:added`` signal.
|
|
121
118
|
- ``OrderableAdmin`` can be used both for inlines and parents, but this
|
|
122
119
|
also means that you cannot register a model directly with
|
|
123
120
|
``OrderableAdmin``.
|
|
@@ -35,7 +35,7 @@ attribute is set to the correct value:
|
|
|
35
35
|
class MyModel(OrderableModel):
|
|
36
36
|
# ...
|
|
37
37
|
|
|
38
|
-
class Meta(OrderableModel):
|
|
38
|
+
class Meta(OrderableModel.Meta):
|
|
39
39
|
# ...
|
|
40
40
|
|
|
41
41
|
|
|
@@ -49,16 +49,16 @@ Orderable change lists
|
|
|
49
49
|
@admin.register(MyModel)
|
|
50
50
|
class MyModelAdmin(OrderableAdmin, admin.ModelAdmin):
|
|
51
51
|
# The field used for ordering. Prepend a minus for reverse
|
|
52
|
-
# ordering: "-
|
|
53
|
-
ordering_field = "
|
|
52
|
+
# ordering: "-ordering"
|
|
53
|
+
ordering_field = "ordering" # The default.
|
|
54
54
|
|
|
55
55
|
# You may optionally hide the ordering field in the changelist:
|
|
56
56
|
# ordering_field_hide_input = False
|
|
57
57
|
|
|
58
58
|
# The ordering field must be included both in list_display and
|
|
59
59
|
# list_editable:
|
|
60
|
-
list_display = ["name", "
|
|
61
|
-
list_editable = ["
|
|
60
|
+
list_display = ["name", "ordering"]
|
|
61
|
+
list_editable = ["ordering"]
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
Orderable inlines
|
|
@@ -71,8 +71,8 @@ Orderable inlines
|
|
|
71
71
|
class MyModelTabularInline(OrderableAdmin, admin.TabularInline):
|
|
72
72
|
model = MyModel
|
|
73
73
|
|
|
74
|
-
# Same as above; "-
|
|
75
|
-
ordering_field = "
|
|
74
|
+
# Same as above; "-ordering" is also allowed here:
|
|
75
|
+
ordering_field = "ordering"
|
|
76
76
|
# ordering_field_hide_input = False
|
|
77
77
|
|
|
78
78
|
``OrderableAdmin`` comes with a default of ``extra = 0`` (no extra
|
|
@@ -84,9 +84,6 @@ inlines just because you wanted to change the ordering.
|
|
|
84
84
|
Limitations
|
|
85
85
|
===========
|
|
86
86
|
|
|
87
|
-
- Starting with Django 1.9 newly created inlines are automatically
|
|
88
|
-
assigned a good ordering value. Earlier versions do not support the
|
|
89
|
-
required ``formset:added`` signal.
|
|
90
87
|
- ``OrderableAdmin`` can be used both for inlines and parents, but this
|
|
91
88
|
also means that you cannot register a model directly with
|
|
92
89
|
``OrderableAdmin``.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.18.2"
|
|
@@ -75,4 +75,14 @@ class OrderableAdmin(BaseModelAdmin):
|
|
|
75
75
|
id="admin_ordering.E001",
|
|
76
76
|
)
|
|
77
77
|
)
|
|
78
|
+
ordering = self.model._meta.ordering
|
|
79
|
+
if list(ordering)[:1] != [self.ordering_field]:
|
|
80
|
+
errors.append(
|
|
81
|
+
checks.Warning(
|
|
82
|
+
f"The ordering of {self.model._meta.label} is {ordering}, but {self.__class__.__name__} uses {self.ordering_field!r}. This is inconsistent and potentially broken.",
|
|
83
|
+
obj=self.__class__,
|
|
84
|
+
id="admin_ordering.W004",
|
|
85
|
+
hint="Check that ordering_field is set if you're using a descending ordering.",
|
|
86
|
+
)
|
|
87
|
+
)
|
|
78
88
|
return errors
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* global django */
|
|
2
|
-
django.jQuery(
|
|
2
|
+
django.jQuery(($) => {
|
|
3
3
|
function updatePlaceholderHeight(ui) {
|
|
4
4
|
// set placeholder height equal to item height
|
|
5
5
|
ui.placeholder.height(ui.item.outerHeight())
|
|
@@ -18,28 +18,28 @@ django.jQuery(function ($) {
|
|
|
18
18
|
$(".admin-ordering-context:not(.activated)")
|
|
19
19
|
.addClass("activated")
|
|
20
20
|
.each(function () {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
let $sortable
|
|
22
|
+
let $sortableHandle
|
|
23
|
+
const $sortableInputWrapper =
|
|
24
|
+
'<span class="admin-ordering-field-input-wrapper"></span>'
|
|
25
|
+
const $sortableHandleSelector = ".admin-ordering-field-input-wrapper"
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
if (data.field.indexOf("-")
|
|
27
|
+
const data = JSON.parse(this.getAttribute("data-context"))
|
|
28
|
+
if (data.field.indexOf("-") === 0) {
|
|
29
29
|
data.field = data.field.substring(1)
|
|
30
30
|
data.fieldDesc = true
|
|
31
31
|
} else {
|
|
32
32
|
data.fieldDesc = false
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const inputFieldSelector = `input[name$="-${data.field}"]`
|
|
36
36
|
|
|
37
37
|
function updateOrdering(nodes) {
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const incOrdering = 10
|
|
39
|
+
const maxOrdering = nodes.length * incOrdering
|
|
40
40
|
nodes.each(function (index) {
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
const row = $(this)
|
|
42
|
+
const rowOrdering = data.fieldDesc
|
|
43
43
|
? maxOrdering - incOrdering * index
|
|
44
44
|
: incOrdering * (index + 1)
|
|
45
45
|
row.find(inputFieldSelector).val(rowOrdering)
|
|
@@ -48,60 +48,60 @@ django.jQuery(function ($) {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
if (data.tabular) {
|
|
51
|
-
$sortable = $(
|
|
52
|
-
$sortableHandle = $sortable.find(
|
|
51
|
+
$sortable = $(`#${data.prefix}-group tbody`)
|
|
52
|
+
$sortableHandle = $sortable.find(`.field-${data.field}`)
|
|
53
53
|
$sortableHandle.addClass("admin-ordering-field")
|
|
54
54
|
if (data.fieldHideInput) {
|
|
55
55
|
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
|
56
56
|
}
|
|
57
57
|
$sortableHandle
|
|
58
|
-
.find(inputFieldSelector
|
|
58
|
+
.find(`${inputFieldSelector}:not([type="hidden"])`)
|
|
59
59
|
.wrap($sortableInputWrapper)
|
|
60
60
|
$sortable.sortable({
|
|
61
61
|
items: ">.has_original",
|
|
62
62
|
handle: $sortableHandleSelector,
|
|
63
|
-
start:
|
|
63
|
+
start: (_event, ui) => {
|
|
64
64
|
hideHorizontalOverflow()
|
|
65
65
|
updatePlaceholderHeight(ui)
|
|
66
66
|
// fix ui item height
|
|
67
67
|
ui.item.css("height", ui.item.outerHeight())
|
|
68
68
|
},
|
|
69
|
-
update:
|
|
70
|
-
updateOrdering($(
|
|
69
|
+
update: (_event, _ui) => {
|
|
70
|
+
updateOrdering($(`.dynamic-${data.prefix}`))
|
|
71
71
|
},
|
|
72
|
-
stop:
|
|
72
|
+
stop: (_event, ui) => {
|
|
73
73
|
autoHorizontalOverflow()
|
|
74
74
|
// reset ui item height
|
|
75
75
|
ui.item.css("height", "auto")
|
|
76
76
|
},
|
|
77
77
|
})
|
|
78
78
|
} else if (data.stacked) {
|
|
79
|
-
$sortable = $(
|
|
80
|
-
$sortableHandle = $sortable.find(
|
|
79
|
+
$sortable = $(`#${data.prefix}-group`)
|
|
80
|
+
$sortableHandle = $sortable.find(`.field-${data.field}`)
|
|
81
81
|
$sortableHandle.addClass("admin-ordering-field")
|
|
82
82
|
if (data.fieldHideInput) {
|
|
83
83
|
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
|
84
84
|
}
|
|
85
85
|
$sortableHandle
|
|
86
|
-
.find(inputFieldSelector
|
|
86
|
+
.find(`${inputFieldSelector}:not([type="hidden"])`)
|
|
87
87
|
.wrap($sortableInputWrapper)
|
|
88
88
|
$sortable.sortable({
|
|
89
89
|
items: ">.has_original,>>.has_original",
|
|
90
90
|
handle: $sortableHandleSelector,
|
|
91
|
-
start:
|
|
91
|
+
start: (_event, ui) => {
|
|
92
92
|
hideHorizontalOverflow()
|
|
93
93
|
updatePlaceholderHeight(ui)
|
|
94
94
|
},
|
|
95
|
-
update:
|
|
96
|
-
updateOrdering($(
|
|
95
|
+
update: (_event, _ui) => {
|
|
96
|
+
updateOrdering($(`.dynamic-${data.prefix}`))
|
|
97
97
|
},
|
|
98
|
-
stop:
|
|
98
|
+
stop: (_event, _ui) => {
|
|
99
99
|
autoHorizontalOverflow()
|
|
100
100
|
},
|
|
101
101
|
})
|
|
102
102
|
} else {
|
|
103
103
|
$sortable = $("#result_list tbody")
|
|
104
|
-
$sortableHandle = $sortable.find(
|
|
104
|
+
$sortableHandle = $sortable.find(`.field-${data.field}`)
|
|
105
105
|
$sortableHandle.addClass("admin-ordering-field")
|
|
106
106
|
if (data.fieldHideInput) {
|
|
107
107
|
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
|
@@ -110,34 +110,33 @@ django.jQuery(function ($) {
|
|
|
110
110
|
return
|
|
111
111
|
}
|
|
112
112
|
$sortableHandle
|
|
113
|
-
.find(inputFieldSelector
|
|
113
|
+
.find(`${inputFieldSelector}:not([type="hidden"])`)
|
|
114
114
|
.wrap($sortableInputWrapper)
|
|
115
115
|
$sortable.sortable({
|
|
116
116
|
handle: $sortableHandleSelector,
|
|
117
|
-
start:
|
|
117
|
+
start: (_event, ui) => {
|
|
118
118
|
hideHorizontalOverflow()
|
|
119
119
|
updatePlaceholderHeight(ui)
|
|
120
120
|
},
|
|
121
|
-
update:
|
|
121
|
+
update: (_event, _ui) => {
|
|
122
122
|
updateOrdering($sortable.find("tr"))
|
|
123
123
|
},
|
|
124
|
-
stop:
|
|
124
|
+
stop: (_event, _ui) => {
|
|
125
125
|
autoHorizontalOverflow()
|
|
126
126
|
},
|
|
127
127
|
})
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
if (data.tabular || data.stacked) {
|
|
131
|
-
// Yay, Django 1.9 or better!
|
|
132
131
|
$(document).on("formset:added", function newForm(event, $row) {
|
|
133
|
-
if (event.detail
|
|
132
|
+
if (event.detail?.formsetName) {
|
|
134
133
|
// Django 4.1 or better!
|
|
135
|
-
if ($(event.target).hasClass(
|
|
136
|
-
updateOrdering($(
|
|
134
|
+
if ($(event.target).hasClass(`dynamic-${data.prefix}`)) {
|
|
135
|
+
updateOrdering($(`.dynamic-${data.prefix}`))
|
|
137
136
|
}
|
|
138
137
|
} else {
|
|
139
|
-
if ($row.hasClass(
|
|
140
|
-
updateOrdering($(
|
|
138
|
+
if ($row.hasClass(`dynamic-${data.prefix}`)) {
|
|
139
|
+
updateOrdering($(`.dynamic-${data.prefix}`))
|
|
141
140
|
}
|
|
142
141
|
}
|
|
143
142
|
})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.18.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|