summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/models.py17
-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
-rw-r--r--ishtar_common/templates/base.html2
6 files changed, 106 insertions, 21 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 89f3edee4..2e9af17c1 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -84,6 +84,23 @@ class Dating(models.Model):
return unicode(self.period)
return u"%s (%s-%s)" % (self.period, start_date, end_date)
+ @classmethod
+ def is_identical(cls, dating_1, dating_2):
+ """
+ Compare two dating attribute by attribute and return True if all
+ attribute is identical
+ """
+ for attr in ["period", "start_date", "end_date", "dating_type",
+ "quality", "precise_dating"]:
+ value1 = getattr(dating_1, attr)
+ value2 = getattr(dating_2, attr)
+ if attr == "precise_dating":
+ value1 = value1.strip()
+ value2 = value2.strip()
+ if value1 != value2:
+ return False
+ return True
+
def context_records_lbl(self):
return u" - ".join(
[cr.cached_label for cr in self.context_records.all()]
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):
diff --git a/ishtar_common/templates/base.html b/ishtar_common/templates/base.html
index ab2baf955..e5af101d5 100644
--- a/ishtar_common/templates/base.html
+++ b/ishtar_common/templates/base.html
@@ -44,7 +44,7 @@
var activate_own_search_msg = "{% trans 'Searches in the shortcut menu deal with only your items.' %}";
var search_pinned_msg = "{% trans 'Search pinned' %}";
var added_message = "{% trans " items added." %}";
- var select_only_one_msg = {% trans "Select only one item." %};
+ var select_only_one_msg = "{% trans "Select only one item." %}";
var YES = "{% trans 'yes' %}";
var NO = "{% trans 'no' %}";
var autorefresh_message_start = "{% trans 'Autorefresh start. The form is disabled.' %}";