diff --git a/adminsortable/admin.py b/adminsortable/admin.py
index 7c7bd6c..10281a6 100644
--- a/adminsortable/admin.py
+++ b/adminsortable/admin.py
@@ -32,6 +32,8 @@ class SortableAdminBase(object):
change_form_template_extends = 'admin/change_form.html'
change_list_template_extends = 'admin/change_list.html'
+ after_sorting_js_callback_name = None
+
def changelist_view(self, request, extra_context=None):
"""
If the model that inherits Sortable has more than one object,
@@ -206,7 +208,11 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
except AttributeError:
verbose_name_plural = opts.verbose_name_plural
- context = self.admin_site.each_context(request)
+ if VERSION <= (1, 7):
+ context = {}
+ else:
+ context = self.admin_site.each_context(request)
+
context.update({
'title': u'Drag and drop {0} to change display order'.format(
capfirst(verbose_name_plural)),
@@ -218,7 +224,8 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
'sortable_by_class_is_sortable': sortable_by_class_is_sortable,
'sortable_by_class_display_name': sortable_by_class_display_name,
'jquery_lib_path': jquery_lib_path,
- 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken')
+ 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken'),
+ 'after_sorting_js_callback_name': self.after_sorting_js_callback_name
})
return render(request, self.sortable_change_list_template, context)
@@ -241,7 +248,8 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
'change_form_template_extends': self.change_form_template_extends,
'has_sortable_tabular_inlines': self.has_sortable_tabular_inlines,
'has_sortable_stacked_inlines': self.has_sortable_stacked_inlines,
- 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken')
+ 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken'),
+ 'after_sorting_js_callback_name': self.after_sorting_js_callback_name
})
return super(SortableAdmin, self).change_view(request, object_id,
diff --git a/adminsortable/static/adminsortable/js/admin.sortable.js b/adminsortable/templates/adminsortable/admin.sortable.html
similarity index 83%
rename from adminsortable/static/adminsortable/js/admin.sortable.js
rename to adminsortable/templates/adminsortable/admin.sortable.html
index ad4b099..15a42a1 100644
--- a/adminsortable/static/adminsortable/js/admin.sortable.js
+++ b/adminsortable/templates/adminsortable/admin.sortable.html
@@ -1,47 +1,54 @@
-(function($){
-
- $(function() {
- jQuery('.sortable').sortable({
- axis : 'y',
- containment : 'parent',
- tolerance : 'pointer',
- items : 'li',
- stop : function(event, ui) {
- var indexes = [],
- lineItems = ui.item.parent().find('> li');
-
- lineItems.each(function(i) {
- indexes.push($(this).find(':hidden[name="pk"]').val());
- });
-
- $.ajax({
- url: ui.item.find('a.admin_sorting_url').attr('href'),
- type: 'POST',
- data: { indexes: indexes.join(',') },
- success: function() {
- // set icons based on position
- lineItems.each(function(index, element) {
- var icon = $(element).find('a.admin_sorting_url .fa');
- icon.removeClass('fa-sort-desc fa-sort-asc fa-sort');
-
- if (index === 0) {
- icon.addClass('fa fa-sort-desc');
- }
- else if (index == lineItems.length - 1) {
- icon.addClass('fa fa-sort-asc');
- }
- else {
- icon.addClass('fa fa-sort');
- }
- });
-
- ui.item.effect('highlight', {}, 1000);
- }
- });
- }
- }).click(function(e){
- e.preventDefault();
- });
- });
-
-})(django.jQuery);
+
diff --git a/adminsortable/templates/adminsortable/change_form.html b/adminsortable/templates/adminsortable/change_form.html
index 65763cb..c60b413 100644
--- a/adminsortable/templates/adminsortable/change_form.html
+++ b/adminsortable/templates/adminsortable/change_form.html
@@ -7,17 +7,17 @@
{% url 'admin:jsi18n' as jsi18nurl %}
{% if has_sortable_tabular_inlines or has_sortable_stacked_inlines %}
-
+
{% include 'adminsortable/csrf/jquery.django-csrf.html' with csrf_cookie_name=csrf_cookie_name %}
{% endif %}
{% if has_sortable_tabular_inlines %}
-
+ {% include 'adminsortable/edit_inline/admin.sortable.stacked.inlines.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %}
{% endif %}
{% if has_sortable_stacked_inlines %}
-
+ {% include 'adminsortable/edit_inline/admin.sortable.tabular.inlines.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %}
{% endif %}
{% endblock %}
diff --git a/adminsortable/templates/adminsortable/change_list.html b/adminsortable/templates/adminsortable/change_list.html
index 95ff182..a965dbf 100644
--- a/adminsortable/templates/adminsortable/change_list.html
+++ b/adminsortable/templates/adminsortable/change_list.html
@@ -21,14 +21,14 @@
{% endblock %}
{% block extrahead %}
-{{ block.super }}
-{{ media.js }}
+{{ block.super }}
+{{ media.js }}
{% include 'adminsortable/csrf/jquery.django-csrf.html' with csrf_cookie_name=csrf_cookie_name %}
-
+{% include 'adminsortable/admin.sortable.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %}
diff --git a/adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html
similarity index 89%
rename from adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js
rename to adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html
index 376df13..d993b39 100644
--- a/adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js
+++ b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html
@@ -1,69 +1,77 @@
-(function($){
-
- $(function() {
- var sorting_urls = $(':hidden[name="admin_sorting_url"]');
- if (sorting_urls.length)
- {
- var sortable_inline_group = sorting_urls.closest('.inline-group');
- var tabular_inline_rows = sortable_inline_group.find('.tabular table tbody tr');
-
- tabular_inline_rows.addClass('sortable');
-
- sortable_inline_group.find('.tabular.inline-related').sortable({
- axis : 'y',
- containment : 'parent',
- create: function(event, ui) {
- $('td.delete :checkbox').unbind();
- },
- tolerance : 'pointer',
- items : 'tr:not(.add-row)',
- stop : function(event, ui) {
- if ($('.inline-deletelink').length > 0) {
- $(ui.sender).sortable('cancel');
- alert($('#localized_save_before_reorder_message').val());
- return false;
- }
-
- var indexes = [];
- ui.item.parent().children('tr').each(function(i)
- {
- var index_value = $(this).find('.original :input:first').val();
+
diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite
index d439e4a..944cf22 100644
Binary files a/sample_project/database/test_project.sqlite and b/sample_project/database/test_project.sqlite differ
diff --git a/sample_project/samples/admin.py b/sample_project/samples/admin.py
index ec18418..fb1acf1 100644
--- a/sample_project/samples/admin.py
+++ b/sample_project/samples/admin.py
@@ -83,6 +83,9 @@ class ProjectAdmin(SortableAdmin):
NonSortableCreditInline, NonSortableNoteInline
]
list_display = ['__str__', 'category']
+ after_sorting_js_callback_name = 'afterSortCallback'
+ sortable_change_list_template = 'adminsortable/custom_change_list.html'
+ sortable_change_form_template = "adminsortable/custom_change_form.html"
admin.site.register(Project, ProjectAdmin)
diff --git a/sample_project/templates/adminsortable/custom_change_form.html b/sample_project/templates/adminsortable/custom_change_form.html
new file mode 100644
index 0000000..84f706c
--- /dev/null
+++ b/sample_project/templates/adminsortable/custom_change_form.html
@@ -0,0 +1,15 @@
+{% extends "adminsortable/change_form.html" %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+
+{% endblock %}
diff --git a/sample_project/templates/adminsortable/custom_change_list.html b/sample_project/templates/adminsortable/custom_change_list.html
new file mode 100644
index 0000000..3fbc2b6
--- /dev/null
+++ b/sample_project/templates/adminsortable/custom_change_list.html
@@ -0,0 +1,15 @@
+{% extends 'adminsortable/change_list.html' %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+
+{% endblock %}