diff --git a/adminsortable/__init__.py b/adminsortable/__init__.py index c78eaf5..b82f3ec 100644 --- a/adminsortable/__init__.py +++ b/adminsortable/__init__.py @@ -1,4 +1,4 @@ -VERSION = (2, 0, 0) # following PEP 386 +VERSION = (2, 0, 1) # following PEP 386 DEV_N = None diff --git a/adminsortable/admin.py b/adminsortable/admin.py index ddde83b..90e4d38 100644 --- a/adminsortable/admin.py +++ b/adminsortable/admin.py @@ -246,21 +246,23 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): objects_dict = dict([(str(obj.pk), obj) for obj in klass.objects.filter(pk__in=indexes)]) - if '-{}'.format(klass.order_field_name) in klass._meta.ordering: + order_field_name = klass._meta.ordering[0] + + if '-' in order_field_name: step = -1 start_object = max(objects_dict.values(), - key=lambda x: getattr(x, klass.order_field_name)) + key=lambda x: getattr(x, order_field_name)) else: step = 1 start_object = min(objects_dict.values(), - key=lambda x: getattr(x, klass.order_field_name)) + key=lambda x: getattr(x, order_field_name)) - start_index = getattr(start_object, klass.order_field_name, + start_index = getattr(start_object, order_field_name, len(indexes)) for index in indexes: obj = objects_dict.get(index) - setattr(obj, klass.order_field_name, start_index) + setattr(obj, order_field_name, start_index) obj.save() start_index += step response = {'objects_sorted': True} diff --git a/adminsortable/models.py b/adminsortable/models.py index 0caec5d..f1572ad 100644 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -23,12 +23,9 @@ class SortableMixin(models.Model): inherits Sortable `save` the override of save increments the last/highest value of - `order_field_name` by 1 + `Meta.ordering` by 1 """ - # order = models.PositiveIntegerField(editable=False, default=1, - # db_index=True) - order_field_name = 'order' is_sortable = False sorting_filters = () @@ -46,16 +43,25 @@ class SortableMixin(models.Model): def __init__(self, *args, **kwargs): super(SortableMixin, self).__init__(*args, **kwargs) - # get the model field defined by `order_field_name` + # Check that Meta.ordering contains one value + try: + self.order_field_name = self._meta.ordering[0].replace('-', '') + except IndexError: + raise ValueError(u'You must define the Meta.ordering ' + u'property on your model.') + + # get the model field defined by `Meta.ordering` self.order_field = self._meta.get_field(self.order_field_name) integer_fields = (models.PositiveIntegerField, models.IntegerField, models.PositiveSmallIntegerField, models.SmallIntegerField, models.BigIntegerField,) + + # check that the order field is an integer type if not self.order_field or not isinstance(self.order_field, integer_fields): raise NotImplemented(u'You must define the field ' - '`order_field_name` refers to, and it must be of type: ' + '`Meta.ordering` refers to, and it must be of type: ' 'PositiveIntegerField, IntegerField, ' 'PositiveSmallIntegerField, SmallIntegerField, ' 'BigIntegerField') diff --git a/sample_project/app/models.py b/sample_project/app/models.py index 50272c2..fb97747 100644 --- a/sample_project/app/models.py +++ b/sample_project/app/models.py @@ -24,7 +24,7 @@ class Category(SimpleModel, SortableMixin): verbose_name_plural = 'Categories' ordering = ['order'] - order = models.PositiveIntegerField(default=0, editable=False) + order = models.PositiveIntegerField(default=0) # A model with an override of its queryset for admin @@ -211,8 +211,6 @@ class CustomWidget(SortableMixin, SimpleModel): custom_order_field = models.PositiveIntegerField(default=0, db_index=True, editable=False) - order_field_name = 'custom_order_field' - class Meta: ordering = ['custom_order_field'] verbose_name = 'Custom Widget' @@ -231,8 +229,6 @@ class CustomWidgetComponent(SortableMixin, SimpleModel): widget_order = models.PositiveIntegerField(default=0, db_index=True, editable=False) - order_field_name = 'widget_order' - class Meta: ordering = ['widget_order'] verbose_name = 'Custom Widget Component' diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index 83d7d34..f1f8492 100644 Binary files a/sample_project/database/test_project.sqlite and b/sample_project/database/test_project.sqlite differ