diff options
| -rw-r--r-- | archaeological_finds/models_finds.py | 22 | ||||
| -rw-r--r-- | archaeological_finds/tests.py | 47 | 
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] | 
