From 29c1517bdec274a7a015a24140a63aeb7b749b4b Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 29 Aug 2017 15:52:53 +0200 Subject: Finds: delete associated treatment on find deletion (refs #3723) --- archaeological_finds/models_finds.py | 18 +++++++++++++++++- archaeological_finds/tests.py | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 78280bede..bc96ded25 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -24,7 +24,8 @@ from django.contrib.gis.db import models from django.core.urlresolvers import reverse from django.db import connection, transaction from django.db.models import Max, Q -from django.db.models.signals import m2m_changed, post_save, post_delete +from django.db.models.signals import m2m_changed, post_save, post_delete, \ + pre_delete from django.utils.translation import ugettext_lazy as _, ugettext from ishtar_common.utils import cached_label_changed, post_save_point @@ -1102,7 +1103,22 @@ class Find(ValueGetter, BaseHistorizedItem, ImageModel, OwnPerms, Dating.fix_dating_association(self) +def pre_clean_treatments(sender, **kwargs): + if not kwargs.get('instance'): + return + instance = kwargs.get('instance') + if instance.downstream_treatment: + # TODO: not managed for now. Raise an error? + return + if not instance.upstream_treatment: + return + instance.upstream_treatment.upstream.clear() + instance.upstream_treatment.downstream.clear() + instance.upstream_treatment.delete() + + post_save.connect(cached_label_changed, sender=Find) +pre_delete.connect(pre_clean_treatments, sender=Find) def base_find_find_changed(sender, **kwargs): diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index f8f134c0a..933b5f292 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -599,3 +599,26 @@ class PackagingTest(FindInit, TestCase): self.assertNotIn( item, self.finds, msg="Other basket have not been upgraded after packaging") + + def test_delete(self): + # manage treatment deletion + treatment_type = models.TreatmentType.objects.get(txt_idx='packaging') + treatment = models.Treatment() + + initial_find = self.finds[0] + treatment.save(user=self.get_default_user(), items=self.basket) + treatment.treatment_types.add(treatment_type) + + resulting_find = models.Find.objects.get( + upstream_treatment__upstream=initial_find, + base_finds__pk=initial_find.base_finds.all()[0].pk + ) + resulting_find.delete() + + self.assertEqual( + models.Treatment.objects.filter(pk=treatment.pk).count(), 0) + q = models.Find.objects.filter(pk=initial_find.pk) + # initial find not deleted + self.assertEqual(q.count(), 1) + initial_find = q.all()[0] + self.assertEqual(initial_find.upstream_treatment, None) -- cgit v1.2.3 From 02369bdd4c7d82f43cef34fa19344876087a8159 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 29 Aug 2017 16:13:34 +0200 Subject: Find deletions: delete associated base find (refs #3724) --- archaeological_finds/models_finds.py | 10 ++++++++-- archaeological_finds/tests.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index bc96ded25..66059079b 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1103,10 +1103,16 @@ class Find(ValueGetter, BaseHistorizedItem, ImageModel, OwnPerms, Dating.fix_dating_association(self) -def pre_clean_treatments(sender, **kwargs): +def pre_clean_find(sender, **kwargs): if not kwargs.get('instance'): 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 instance.downstream_treatment: # TODO: not managed for now. Raise an error? return @@ -1118,7 +1124,7 @@ def pre_clean_treatments(sender, **kwargs): post_save.connect(cached_label_changed, sender=Find) -pre_delete.connect(pre_clean_treatments, sender=Find) +pre_delete.connect(pre_clean_find, sender=Find) def base_find_find_changed(sender, **kwargs): diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 933b5f292..b4a798807 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -412,6 +412,20 @@ class FindTest(FindInit, TestCase): self.assertEqual(response.status_code, 200) self.assertIn('class="sheet"', response.content) + def test_delete(self): + self.create_finds(force=True) + first_bf = self.base_finds[0] + self.finds[1].base_finds.add(first_bf) + + self.finds[0].delete() + # on delete the selected base find is not deleted if another find + # is related to it + self.assertEqual(models.BaseFind.objects.filter( + pk=self.base_finds[0].pk).count(), 1) + self.finds[1].delete() + self.assertEqual(models.BaseFind.objects.filter( + pk=self.base_finds[0].pk).count(), 0) + class FindSearchTest(FindInit, TestCase): fixtures = FIND_FIXTURES -- cgit v1.2.3