From 7a242dd41c16a79308270e4c7fdb21b928e2fa93 Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Wed, 16 Nov 2011 20:24:33 -0600 Subject: [PATCH 1/2] Refactored classmethods to use aggregation Max instead order_by. --- adminsortable/models.py | 17 +++++++++-------- sample_project/app/tests.py | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/adminsortable/models.py b/adminsortable/models.py index 8104ea1..f3d58e8 100755 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -24,9 +24,10 @@ class Sortable(models.Model): @classmethod def is_sortable(cls): try: - return True if cls.objects.order_by('-order')[:1][0].order > 1 else False - except IndexError: - return False + max_order = cls.objects.aggregate(models.Max('order'))['order__max'] + except TypeError, IndexError: + max_order = 0 + return True if max_order > 1 else False @classmethod def model_type_id(cls): @@ -35,9 +36,9 @@ class Sortable(models.Model): def save(self, *args, **kwargs): if not self.id: try: - #increment the order field by adding one to the last value of order - self.order = self.__class__.objects.order_by('-order')[:1][0].order + 1 - except IndexError: - #order defaults to 1 - pass + max_order = self.__class__.objects.aggregate(models.Max('order'))['order__max'] + 1 + except TypeError, IndexError: + max_order = 1 + self.order = max_order + super(Sortable, self).save(*args, **kwargs) diff --git a/sample_project/app/tests.py b/sample_project/app/tests.py index 11922ad..3eb1677 100755 --- a/sample_project/app/tests.py +++ b/sample_project/app/tests.py @@ -34,7 +34,7 @@ class SortableTestCase(TestCase): self.user.save() def create_category(self, title='Category 1'): - category, _ = Category.objects.get_or_create(title=title) + category = Category.objects.create(title=title) return category def test_new_user_is_authenticated(self): From fba568399c3d11d71569ace58b7fd56aa0eb285d Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Wed, 16 Nov 2011 20:50:12 -0600 Subject: [PATCH 2/2] Eliminated setting of self.order to 1 if Max returns None, as order has a default value of 1 defined in the field. --- adminsortable/models.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/adminsortable/models.py b/adminsortable/models.py index f3d58e8..0d74262 100755 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -36,9 +36,8 @@ class Sortable(models.Model): def save(self, *args, **kwargs): if not self.id: try: - max_order = self.__class__.objects.aggregate(models.Max('order'))['order__max'] + 1 + self.order = self.__class__.objects.aggregate(models.Max('order'))['order__max'] + 1 except TypeError, IndexError: - max_order = 1 - self.order = max_order + pass super(Sortable, self).save(*args, **kwargs)