diff options
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 |
commit | 13531adff386cc09c7f41c02ba7c116575cb6ee1 (patch) | |
tree | 51067bbe4ac2bb44a139c2bc813d1442d2db4582 /archaeological_finds | |
parent | 1d26a7a62d150d19e659e66515fcda5a40c6c68a (diff) | |
download | Ishtar-13531adff386cc09c7f41c02ba7c116575cb6ee1.tar.bz2 Ishtar-13531adff386cc09c7f41c02ba7c116575cb6ee1.zip |
Treatments: better management of merge - tests
Diffstat (limited to 'archaeological_finds')
-rw-r--r-- | archaeological_finds/models_finds.py | 10 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 19 | ||||
-rw-r--r-- | archaeological_finds/tests.py | 67 | ||||
-rw-r--r-- | archaeological_finds/wizards.py | 12 |
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): |