summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_finds/models_finds.py24
-rw-r--r--archaeological_finds/tests.py37
2 files changed, 60 insertions, 1 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 59b8eb1d0..b3a167a26 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.data_importer import post_importer_action, ImporterError
@@ -1219,7 +1220,28 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
Dating.fix_dating_association(self)
+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
+ 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_find, sender=Find)
def base_find_find_changed(sender, **kwargs):
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 1d5559dbb..a128b05ff 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -435,6 +435,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
@@ -622,3 +636,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)