From 3c2935776e8122fbcfd1e33120d2793f1383f100 Mon Sep 17 00:00:00 2001 From: Ruben Dura Tari Date: Tue, 11 Oct 2016 18:53:45 +0100 Subject: [PATCH 1/2] Enables support for primary keys that are not AutoFields. Specially useful when using UUIDs as primary keys. --- adminsortable/models.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/adminsortable/models.py b/adminsortable/models.py index 0e2c965..6e58f47 100644 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -1,5 +1,6 @@ from django.contrib.contenttypes.models import ContentType from django.db import models +from django.utils import version from adminsortable.fields import SortableForeignKey @@ -87,7 +88,11 @@ class SortableMixin(models.Model): 'typecast to an integer.' def save(self, *args, **kwargs): - if not self.pk: + major, minor, _, _, _ = version.get_complete_version() + needs_default = (self._state.adding + if major == 1 and minor >= 8 + else not self.pk) + if needs_default: try: current_max = self.__class__.objects.aggregate( models.Max(self.order_field_name))[self.order_field_name + '__max'] or 0 From e4355d84bce6876df5f5f1600bb6db98c7922db6 Mon Sep 17 00:00:00 2001 From: Ruben Dura Tari Date: Tue, 11 Oct 2016 19:47:17 +0100 Subject: [PATCH 2/2] Adds test --- .gitignore | 2 ++ sample_project/app/tests.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/.gitignore b/.gitignore index 06ec6d9..2b8b9e3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ atlassian-* .ropeproject .codeintel __pycache__ +.venv/ +build diff --git a/sample_project/app/tests.py b/sample_project/app/tests.py index 7877f7c..aab4af2 100644 --- a/sample_project/app/tests.py +++ b/sample_project/app/tests.py @@ -4,6 +4,7 @@ except ImportError: import http.client as httplib import json +import uuid from django.contrib.auth.models import User from django.db import models @@ -27,6 +28,14 @@ class TestSortableModel(SortableMixin): return self.title +class TestNonAutoFieldModel(SortableMixin): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + order = models.PositiveIntegerField(editable=False, db_index=True) + + class Meta: + ordering = ['order'] + + class SortableTestCase(TestCase): def setUp(self): self.client = Client() @@ -325,3 +334,7 @@ class SortableTestCase(TestCase): ] self.assertEqual(notes, expected_notes) + def test_save_non_auto_field_model(self): + model = TestNonAutoFieldModel() + model.save() +