From f33f5e90edf81716d01bb3c6141b1826712ce035 Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Sun, 21 Sep 2014 15:12:30 -0400 Subject: [PATCH] Refactored do_sorting_view to get start_index default value from len(indexes) rather than duplicate the line and set to 0. Added NonSortableParentAdmin class to enable sorting URLs and JavaScript on models that do not inherit from Sortable. Removed unused 'ordering' property on SortableAdmin. Changed assignment of sorting_filters to use getattr, enabling NonSortableParentAdmin to inherit from SortableAdminBase. Moved template properties to SortableAdminBase. --- adminsortable/admin.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/adminsortable/admin.py b/adminsortable/admin.py index 2044c12..5f3653d 100644 --- a/adminsortable/admin.py +++ b/adminsortable/admin.py @@ -27,6 +27,14 @@ STATIC_URL = settings.STATIC_URL class SortableAdminBase(object): + sortable_change_list_with_sort_link_template = \ + 'adminsortable/change_list_with_sort_link.html' + sortable_change_form_template = 'adminsortable/change_form.html' + sortable_change_list_template = 'adminsortable/change_list.html' + + change_form_template_extends = 'admin/change_form.html' + change_list_template_extends = 'admin/change_list.html' + def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, @@ -45,7 +53,7 @@ class SortableAdminBase(object): extra_context.update({ 'change_list_template_extends': self.change_list_template_extends, 'sorting_filters': [sort_filter[0] for sort_filter - in self.model.sorting_filters] + in getattr(self.model, 'sorting_filters', [])] }) return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context) @@ -56,15 +64,6 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): Admin class to add template overrides and context objects to enable drag-and-drop ordering. """ - ordering = ('order', 'id') - - sortable_change_list_with_sort_link_template = \ - 'adminsortable/change_list_with_sort_link.html' - sortable_change_form_template = 'adminsortable/change_form.html' - sortable_change_list_template = 'adminsortable/change_list.html' - - change_form_template_extends = 'admin/change_form.html' - change_list_template_extends = 'admin/change_list.html' class Meta: abstract = True @@ -89,6 +88,7 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): Custom admin view that displays the objects as a list whose sort order can be changed via drag-and-drop. """ + opts = self.model._meta has_perm = request.user.has_perm('{0}.{1}'.format(opts.app_label, opts.get_change_permission())) @@ -226,17 +226,17 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): id=model_type_id).model_class() objects_dict = dict([(str(obj.pk), obj) for obj in klass.objects.filter(pk__in=indexes)]) - if '-order' in klass._meta.ordering: # desc order + + if '-order' in klass._meta.ordering: + step = -1 start_object = max(objects_dict.values(), key=lambda x: getattr(x, 'order')) - start_index = getattr(start_object, 'order') \ - or len(indexes) - step = -1 - else: # 'order' is default, asc order + else: + step = 1 start_object = min(objects_dict.values(), key=lambda x: getattr(x, 'order')) - start_index = getattr(start_object, 'order') or 0 - step = 1 + + start_index = getattr(start_object, 'order', len(indexes)) for index in indexes: obj = objects_dict.get(index) @@ -252,6 +252,12 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): content_type='application/json') +class NonSortableParentAdmin(SortableAdmin): + def changelist_view(self, request, extra_context=None): + return super(SortableAdminBase, self).changelist_view(request, + extra_context=extra_context) + + class SortableInlineBase(SortableAdminBase, InlineModelAdmin): def __init__(self, *args, **kwargs): super(SortableInlineBase, self).__init__(*args, **kwargs)