diff options
Diffstat (limited to 'archaeological_context_records')
| -rw-r--r-- | archaeological_context_records/models.py | 15 | ||||
| -rw-r--r-- | archaeological_context_records/tests.py | 30 |
2 files changed, 39 insertions, 6 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index 4da7e35e2..87300b899 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -27,7 +27,7 @@ from django.contrib.postgres.indexes import GinIndex from django.contrib.sites.models import Site from django.db import transaction, OperationalError, IntegrityError from django.db.models import Q -from django.db.models.signals import post_delete, post_save, m2m_changed +from django.db.models.signals import m2m_changed, pre_delete, post_delete, post_save from django.urls import reverse, reverse_lazy from ishtar_common.utils import get_generated_id, gettext_lazy as _, pgettext_lazy, \ @@ -59,6 +59,7 @@ from ishtar_common.models import ( RelationItem, Town, get_current_profile, + geo_item_pre_delete, document_attached_changed, HistoryModel, GeoItem, @@ -1485,10 +1486,11 @@ class ContextRecord( Return sub object list that will be deleted :return: {"Sub object type": ["Sub object 1", "Sub object 2", ...]} """ + data = super().get_deleted_data() if not self.base_finds.count(): - return {} + return data lbl = str(_("Base finds")) - data = {lbl: []} + data[lbl] = [] for item in self.base_finds.all(): data[lbl].append(str(item)) for key, value in item.get_deleted_data().items(): @@ -1514,11 +1516,11 @@ class ContextRecord( def context_record_post_save(sender, **kwargs): - cached_label_changed(sender=sender, **kwargs) - post_save_geo(sender=sender, **kwargs) instance = kwargs.get("instance", None) - if not instance or not instance.pk: + if not instance or not instance.pk or getattr(instance, "__delete", False): return + cached_label_changed(sender=sender, **kwargs) + post_save_geo(sender=sender, **kwargs) profile = get_current_profile() if profile.parent_relations_engine == "T": ContextRecordTree._update_self_relation(instance.pk) # on creation: manage self relation @@ -1532,6 +1534,7 @@ def context_record_post_save(sender, **kwargs): cached_label_changed(Find, instance=f) +pre_delete.connect(geo_item_pre_delete, sender=ContextRecord) post_save.connect(context_record_post_save, sender=ContextRecord) m2m_changed.connect(document_attached_changed, sender=ContextRecord.documents.through) m2m_changed.connect(geodata_attached_changed, sender=ContextRecord.geodata.through) diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index 942ad83f1..0338a2f20 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -24,6 +24,7 @@ import locale from django.apps import apps from django.conf import settings from django.contrib.auth.models import Permission, Group +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.files.uploadedfile import SimpleUploadedFile from django.template.defaultfilters import slugify @@ -600,6 +601,35 @@ class ContextRecordTest(ContextRecordInit, TestCase): # same unit and other operation -> 1 self.assertEqual(cr3.custom_index, 1) + def test_cascade_delete(self): + cr1 = self.context_records[0] + # add a geo_vector associated to the town + source_content_type_pk = ContentType.objects.get( + app_label="ishtar_common", + model="town" + ).pk + geo_vector = models.GeoVectorData.objects.create( + source_content_type_id=source_content_type_pk, + source_id=cr1.town_id, + name="geo", + comment="This is a comment." + ) + cr1.geodata.add(geo_vector) + BaseFind = apps.get_model("archaeological_finds", "BaseFind") + bf = BaseFind.objects.create(context_record=cr1) + bf.geodata.add(geo_vector) + Find = apps.get_model("archaeological_finds", "Find") + find = Find.objects.create() + bf.find.add(find) + dating = models.ContextRecordDating.objects.create(context_record=cr1) + cr1.operation.delete() + self.assertEqual(models.ContextRecord.objects.filter(id=cr1.id).count(), 0) + self.assertEqual(Find.objects.filter(id=find.id).count(), 0) + self.assertEqual(BaseFind.objects.filter(id=bf.id).count(), 0) + self.assertEqual(models.ContextRecordDating.objects.filter(id=dating.id).count(), + 0) + self.assertEqual(models.GeoVectorData.objects.filter(id=geo_vector.id).count(), 1) + class ContextRecordQATest(ContextRecordInit, TestCase): fixtures = CONTEXT_RECORD_TOWNS_FIXTURES |
