summaryrefslogtreecommitdiff
path: root/archaeological_finds
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-11-28 18:51:28 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-11-28 18:53:28 +0100
commit13531adff386cc09c7f41c02ba7c116575cb6ee1 (patch)
tree51067bbe4ac2bb44a139c2bc813d1442d2db4582 /archaeological_finds
parent1d26a7a62d150d19e659e66515fcda5a40c6c68a (diff)
downloadIshtar-13531adff386cc09c7f41c02ba7c116575cb6ee1.tar.bz2
Ishtar-13531adff386cc09c7f41c02ba7c116575cb6ee1.zip
Treatments: better management of merge - tests
Diffstat (limited to 'archaeological_finds')
-rw-r--r--archaeological_finds/models_finds.py10
-rw-r--r--archaeological_finds/models_treatments.py19
-rw-r--r--archaeological_finds/tests.py67
-rw-r--r--archaeological_finds/wizards.py12
4 files changed, 88 insertions, 20 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index a3aaae50d..9baced4e0 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -1376,12 +1376,20 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
for field in m2m:
if field == 'datings' and copy_datings:
for dating in self.datings.all():
+ is_present = False
+ for current_dating in new.datings.all():
+ if Dating.is_identical(current_dating, dating):
+ is_present = True
+ break
+ if is_present:
+ continue
dating.pk = None
dating.save()
new.datings.add(dating)
else:
for val in getattr(self, field).all():
- getattr(new, field).add(val)
+ if val not in getattr(new, field).all():
+ getattr(new, field).add(val)
return new
@classmethod
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index a902741a3..29afc94e3 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -321,26 +321,19 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem,
create_new_find = bool([tp for tp in treatment_types
if tp.create_new_find])
- dating_keys = ["period", "start_date", "end_date", "dating_type",
- "quality", "precise_dating"]
- current_datings = []
current_base_finds = []
current_documents = []
for upstream_item in upstream_items:
# datings are not explicitly part of the resulting_find
# need to reassociate with no duplicate
for dating in upstream_item.datings.all():
- current_dating = []
- for key in dating_keys:
- value = getattr(dating, key)
- if hasattr(value, 'pk'):
- value = value.pk
- current_dating.append(value)
- current_dating = tuple(current_dating)
- if current_dating in current_datings:
- # do not add similar dating
+ is_present = False
+ for current_dating in new_find.datings.all():
+ if Dating.is_identical(current_dating, dating):
+ is_present = True
+ break
+ if is_present:
continue
- current_datings.append(current_dating)
dating.pk = None # duplicate
dating.save()
new_find.datings.add(dating)
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index b5ec5de83..8d1ffe91d 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -808,7 +808,7 @@ class FindQATest(FindInit, TestCase):
base_desc_1 + u"\n" + extra_desc)
-class PackagingTest(FindInit, TestCase):
+class TreatmentTest(FindInit, TestCase):
fixtures = FIND_FIXTURES
model = models.Find
@@ -875,13 +875,40 @@ class PackagingTest(FindInit, TestCase):
item, self.finds,
msg="Other basket have not been upgraded after packaging")
- def test_delete(self):
- # manage treatment deletion
+ def test_simple_delete(self):
+ treatment_type = models.TreatmentType.objects.get(txt_idx='packaging')
+ treatment_type.create_new_find = False
+ treatment_type.save()
+
+ nb_find = models.Find.objects.count()
+
+ treatment = models.Treatment()
+
+ initial_find = self.finds[0]
+ treatment.save(user=self.get_default_user(), items=self.basket,
+ treatment_type_list=[treatment_type])
+ treatment.treatment_types.add(treatment_type)
+
+ self.assertEqual(nb_find, models.Find.objects.count())
+
+ treatment.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)
+
+ def test_upstream_find_delete(self):
treatment_type = models.TreatmentType.objects.get(txt_idx='packaging')
# make packaging a treatment with a new version of the find created
treatment_type.create_new_find = True
treatment_type.save()
+ nb_find = models.Find.objects.count()
+
treatment = models.Treatment()
initial_find = self.finds[0]
@@ -889,6 +916,10 @@ class PackagingTest(FindInit, TestCase):
treatment_type_list=[treatment_type])
treatment.treatment_types.add(treatment_type)
+ nb_b = self.basket.items.count()
+ self.assertEqual(
+ nb_find + nb_b, models.Find.objects.count())
+
resulting_find = models.Find.objects.get(
upstream_treatment__upstream=initial_find,
base_finds__pk=initial_find.base_finds.all()[0].pk
@@ -902,3 +933,33 @@ class PackagingTest(FindInit, TestCase):
self.assertEqual(q.count(), 1)
initial_find = q.all()[0]
self.assertEqual(initial_find.upstream_treatment, None)
+
+ def test_treatment_delete(self):
+ treatment_type = models.TreatmentType.objects.get(txt_idx='packaging')
+ treatment_type.create_new_find = True
+ treatment_type.save()
+
+ nb_find = models.Find.objects.count()
+
+ treatment = models.Treatment()
+
+ initial_find = self.finds[0]
+ treatment.save(user=self.get_default_user(), items=self.basket,
+ treatment_type_list=[treatment_type])
+ treatment.treatment_types.add(treatment_type)
+
+ nb_b = self.basket.items.count()
+ self.assertEqual(
+ nb_find + nb_b, models.Find.objects.count())
+
+ treatment.delete()
+
+ self.assertEqual(nb_find, models.Find.objects.count())
+
+ 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)
diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py
index 8ed7061e2..43f48ab59 100644
--- a/archaeological_finds/wizards.py
+++ b/archaeological_finds/wizards.py
@@ -246,12 +246,18 @@ class TreatmentN1Wizard(TreatmentBase):
def _update_char_initial_from_finds(self, initial, find, k, sep=' ; '):
r_k = "resulting_" + k
- if not getattr(find, k):
+ value = getattr(find, k)
+ if not value:
return initial
+ value = value.strip()
if not initial[r_k]:
- initial[r_k] = getattr(find, k)
+ initial[r_k] = value
else:
- initial[r_k] += sep + getattr(find, k)
+ # new value is entirely inside the current value
+ if value == initial[r_k] or (value + sep) in initial[r_k] or \
+ (sep + value) in initial[r_k]:
+ return initial
+ initial[r_k] += sep + value
return initial
def get_form_initial(self, step, data=None):