From bee71e6d409c0929abc2d65aed9d6ba9cbbe64a5 Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Wed, 2 Sep 2015 09:38:10 -0400 Subject: [PATCH] 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. --- adminsortable/__init__.py | 2 +- adminsortable/admin.py | 12 +++++++----- adminsortable/models.py | 18 ++++++++++++------ sample_project/app/models.py | 6 +----- sample_project/database/test_project.sqlite | Bin 81920 -> 81920 bytes 5 files changed, 21 insertions(+), 17 deletions(-) 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 83d7d34cb51f5c2d3c3ea76f3d5ecb0c6218a763..f1f84929850f6153a5ce96716cd754aa3eed21f7 100644 GIT binary patch delta 670 zcmaixKWGzS7{UgA1Fz{gXJ!NrK5)eGoO#xXz>wc7aP#D(e8=NIbm#$t}9^>Ucx z-TvC+-H)A!0xJwF*uopXEB*vBL7Zi2_$QJPNZ>caR63Q=h_n-ODf#hMsx)ZGj1c95 zSvIVkQ?zZTGlhk7)?}?Vb;_}4W{cL; zyk*s=#rzp#)_?zu(*a@s8d@|;Qi#PNWtaCJFK5C`AH}aR1#=8@2oQufjN|BGROx^7 zIbO2?FUzxjuv{%BHD!Zg757lbG4v`M;j*ukOL;BADv4}lA4Q}gtU+V%Ov@^pB4;|L zC^=@k3RBOke+Q(KGmJt(*s={sJJifYsL);kf4+nV>uE}7egIArsMr7i delta 237 zcmVjSd`!2@0cfU^+{NCT5z z3pWM>7X$+{0h6Km6O*nBR-*(Y46_6n=$8~YEiyD9F*Z6hH##ykE;2YbG&VA_umltc z0RqAR0>T3Zvmpq!0tkXT0tHQk1woU$%OJDr#uxz#+yDUsw*UjT1Glpg466gPx64g9 z3IhXq00YwlrUQAi5e#bsmw5*Piv$A$?*O+B2m#LnlQ0Arlkl4axAO}D5d;bY1M&a^ n`~&v`^0N^T