summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_finds/models_finds.py22
-rw-r--r--archaeological_finds/tests.py47
2 files changed, 64 insertions, 5 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index aea0f51b4..5f2c9c8d8 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -868,7 +868,19 @@ def post_save_basefind(sender, **kwargs):
post_save_geo(sender, **kwargs)
+def pre_delete_basefind(sender, **kwargs):
+ instance = kwargs["instance"]
+ if not instance or not instance.pk:
+ return
+ q = Find.objects.filter(base_finds__pk=instance.pk)
+ for find in q.all():
+ if find.base_finds.count() == 1: # only associated to the deleted base find
+ find.__base_find_deleted = True # prevent loop
+ find.delete()
+
+
post_save.connect(post_save_basefind, sender=BaseFind)
+pre_delete.connect(pre_delete_basefind, sender=BaseFind)
m2m_changed.connect(geodata_attached_changed, sender=BaseFind.geodata.through)
@@ -3470,10 +3482,12 @@ def pre_clean_find(sender, **kwargs):
return
instance = kwargs.get("instance")
- for bf in instance.base_finds.all():
- # no other find is associated
- if not bf.find.exclude(pk=instance.pk).count():
- bf.delete()
+ if not getattr(instance, "__base_find_deleted", False):
+ # prevent loop
+ for bf in instance.base_finds.all():
+ # no other find is associated
+ if not bf.find.exclude(pk=instance.pk).count():
+ bf.delete()
try:
if instance.downstream_treatment:
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index d5f763467..c98da7951 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -60,6 +60,7 @@ from ishtar_common.models import (
Area,
Document,
)
+from archaeological_operations.models import AdministrativeAct
from archaeological_context_records.models import (
Period,
Dating,
@@ -94,7 +95,7 @@ from ishtar_common.tests import (
GenericSerializationTest,
SearchText,
)
-from archaeological_operations.tests import ImportTest, create_operation
+from archaeological_operations.tests import ImportTest, create_operation, create_administrativact
from archaeological_context_records.tests import ContextRecordInit
from archaeological_operations.serializers import operation_serialization
@@ -1068,6 +1069,50 @@ class FindTest(FindInit, TestCase):
self.client = Client()
self.client.login(username=self.username, password=self.password)
+ def test_cascade_delete_operation(self):
+ # test delete an operation
+ find = self.finds[0]
+ find_id = find.id
+ nb_f = models.Find.objects.count()
+ bf = find.base_finds.all()[0]
+ bf_id = bf.id
+ nb_bf = models.BaseFind.objects.count()
+ cr = bf.context_record
+ cr_id = cr.id
+ nb_cr = ContextRecord.objects.count()
+ operation = cr.operation
+ operation_id = operation.id
+ nb_ope = Operation.objects.count()
+ # attach an admin act
+ __, admin_acts = create_administrativact(self.user, operation)
+ admin_act_id = admin_acts[0].id
+ nb_admin_act = AdministrativeAct.objects.count()
+ operation.delete()
+ self.assertEqual(Operation.objects.filter(pk=operation_id).count(), 0)
+ self.assertEqual(Operation.objects.count(), nb_ope - 1)
+ self.assertEqual(AdministrativeAct.objects.filter(pk=admin_act_id).count(), 0)
+ self.assertEqual(AdministrativeAct.objects.count(), nb_admin_act - 1)
+ self.assertEqual(ContextRecord.objects.filter(pk=cr_id).count(), 0)
+ self.assertEqual(ContextRecord.objects.count(), nb_cr - 1)
+ self.assertEqual(models.BaseFind.objects.filter(pk=bf_id).count(), 0)
+ self.assertEqual(models.BaseFind.objects.count(), nb_bf - 1)
+ self.assertEqual(models.Find.objects.filter(pk=find_id).count(), 0)
+ self.assertEqual(models.Find.objects.count(), nb_f - 1)
+
+ def test_cascade_delete_find(self):
+ # test delete associated base find
+ find = self.finds[0]
+ find_id = find.id
+ nb_f = models.Find.objects.count()
+ bf = find.base_finds.all()[0]
+ bf_id = bf.id
+ nb_bf = models.BaseFind.objects.count()
+ find.delete()
+ self.assertEqual(models.BaseFind.objects.filter(pk=bf_id).count(), 0)
+ self.assertEqual(models.BaseFind.objects.count(), nb_bf - 1)
+ self.assertEqual(models.Find.objects.filter(pk=find_id).count(), 0)
+ self.assertEqual(models.Find.objects.count(), nb_f - 1)
+
def test_external_id(self):
find = self.finds[0]
base_find = find.base_finds.all()[0]