From 0a68e44675a306a57b0b4fdde63c9ae9e479a1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Fri, 7 Jan 2022 13:43:10 -0300 Subject: [PATCH 1/2] feat: prevent sparse indexes when deleting item --- drf_kit/signals.py | 15 ++++++++++++++- test_app/tests/tests_model.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drf_kit/signals.py b/drf_kit/signals.py index ac73ad9..c7f4cf4 100644 --- a/drf_kit/signals.py +++ b/drf_kit/signals.py @@ -1,6 +1,7 @@ import logging -from django.dispatch import Signal +from django.db.models.signals import post_delete +from django.dispatch import Signal, receiver logger = logging.getLogger(__name__) @@ -40,3 +41,15 @@ def __exit__(self, *args, **kwargs): post_soft_delete = Signal(providing_args=["instance"]) pre_undelete = Signal(providing_args=["instance"]) post_undelete = Signal(providing_args=["instance"]) + + +@receiver(post_delete) +def reorder_group(sender, instance, **kwargs): + from drf_kit.models import OrderedModelMixin # pylint: disable=import-outside-toplevel + + if not issubclass(sender, OrderedModelMixin): + return + + if previous := instance.previous(): + # trigger the reordering + previous.save() diff --git a/test_app/tests/tests_model.py b/test_app/tests/tests_model.py index 190a812..f5c35f7 100644 --- a/test_app/tests/tests_model.py +++ b/test_app/tests/tests_model.py @@ -458,3 +458,37 @@ def test_create_before_range(self): self.assertOrder(placement_2, 2) self.assertOrder(placement_3, 3) self.assertOrder(placement_4, 0) + + def test_delete_within_range(self): + year = 1900 + + placement_1 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[0], prize="rock") + placement_2 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[1], prize="stone") + placement_3 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[2], prize="wand") + placement_4 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[3], prize="hug") + + placement_2.delete() + + for placement in [placement_1, placement_3, placement_4]: + placement.refresh_from_db() + + self.assertOrder(placement_1, 0) + self.assertOrder(placement_3, 1) + self.assertOrder(placement_4, 2) + + def test_delete_from_queryset(self): + year = 1900 + + placement_1 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[0], prize="rock") + placement_2 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[1], prize="stone") + placement_3 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[2], prize="wand") + placement_4 = TriWizardPlacement.objects.create(year=year, wizard=self.wizards[3], prize="hug") + + TriWizardPlacement.objects.filter(id=placement_2.id).delete() + + for placement in [placement_1, placement_3, placement_4]: + placement.refresh_from_db() + + self.assertOrder(placement_1, 0) + self.assertOrder(placement_3, 1) + self.assertOrder(placement_4, 2) From b848354d141210d1ccdf83ac325923fb3e4afcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Fri, 7 Jan 2022 13:44:16 -0300 Subject: [PATCH 2/2] build: bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3cdbdaf..6da3716 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "drf-kit" -version = "1.9.0" +version = "1.10.0" description = "DRF Toolkit" authors = ["eduK "] packages = [