Refactored order_field_name out of Sortable class, instead deriving from Meta.ordering, since you have to set Meta.ordering to the order field to get the proper Sorting anyway.

master
Brandon Taylor 2015-09-02 09:38:10 -04:00
parent 74a6cadf8d
commit bee71e6d40
5 changed files with 21 additions and 17 deletions

View File

@ -1,4 +1,4 @@
VERSION = (2, 0, 0) # following PEP 386 VERSION = (2, 0, 1) # following PEP 386
DEV_N = None DEV_N = None

View File

@ -246,21 +246,23 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
objects_dict = dict([(str(obj.pk), obj) for obj in objects_dict = dict([(str(obj.pk), obj) for obj in
klass.objects.filter(pk__in=indexes)]) 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 step = -1
start_object = max(objects_dict.values(), start_object = max(objects_dict.values(),
key=lambda x: getattr(x, klass.order_field_name)) key=lambda x: getattr(x, order_field_name))
else: else:
step = 1 step = 1
start_object = min(objects_dict.values(), 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)) len(indexes))
for index in indexes: for index in indexes:
obj = objects_dict.get(index) obj = objects_dict.get(index)
setattr(obj, klass.order_field_name, start_index) setattr(obj, order_field_name, start_index)
obj.save() obj.save()
start_index += step start_index += step
response = {'objects_sorted': True} response = {'objects_sorted': True}

View File

@ -23,12 +23,9 @@ class SortableMixin(models.Model):
inherits Sortable inherits Sortable
`save` the override of save increments the last/highest value of `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 is_sortable = False
sorting_filters = () sorting_filters = ()
@ -46,16 +43,25 @@ class SortableMixin(models.Model):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SortableMixin, self).__init__(*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) self.order_field = self._meta.get_field(self.order_field_name)
integer_fields = (models.PositiveIntegerField, models.IntegerField, integer_fields = (models.PositiveIntegerField, models.IntegerField,
models.PositiveSmallIntegerField, models.SmallIntegerField, models.PositiveSmallIntegerField, models.SmallIntegerField,
models.BigIntegerField,) models.BigIntegerField,)
# check that the order field is an integer type
if not self.order_field or not isinstance(self.order_field, if not self.order_field or not isinstance(self.order_field,
integer_fields): integer_fields):
raise NotImplemented(u'You must define the field ' 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, ' 'PositiveIntegerField, IntegerField, '
'PositiveSmallIntegerField, SmallIntegerField, ' 'PositiveSmallIntegerField, SmallIntegerField, '
'BigIntegerField') 'BigIntegerField')

View File

@ -24,7 +24,7 @@ class Category(SimpleModel, SortableMixin):
verbose_name_plural = 'Categories' verbose_name_plural = 'Categories'
ordering = ['order'] ordering = ['order']
order = models.PositiveIntegerField(default=0, editable=False) order = models.PositiveIntegerField(default=0)
# A model with an override of its queryset for admin # 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, custom_order_field = models.PositiveIntegerField(default=0, db_index=True,
editable=False) editable=False)
order_field_name = 'custom_order_field'
class Meta: class Meta:
ordering = ['custom_order_field'] ordering = ['custom_order_field']
verbose_name = 'Custom Widget' verbose_name = 'Custom Widget'
@ -231,8 +229,6 @@ class CustomWidgetComponent(SortableMixin, SimpleModel):
widget_order = models.PositiveIntegerField(default=0, db_index=True, widget_order = models.PositiveIntegerField(default=0, db_index=True,
editable=False) editable=False)
order_field_name = 'widget_order'
class Meta: class Meta:
ordering = ['widget_order'] ordering = ['widget_order']
verbose_name = 'Custom Widget Component' verbose_name = 'Custom Widget Component'