diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-21 12:21:58 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-21 12:21:58 +0200 |
commit | 2fde9cc0367c35052068c000f5e3ee26e54b3e20 (patch) | |
tree | de2ae36f8c87a50c0ca91b74df183af1ec287075 | |
parent | 521b2c11e07bcd373275ddf918e523fcdac8be03 (diff) | |
download | Ishtar-2fde9cc0367c35052068c000f5e3ee26e54b3e20.tar.bz2 Ishtar-2fde9cc0367c35052068c000f5e3ee26e54b3e20.zip |
External ID: general filters - deduplicate filter
-rw-r--r-- | archaeological_finds/tests.py | 25 | ||||
-rw-r--r-- | archaeological_operations/tests.py | 2 | ||||
-rw-r--r-- | ishtar_common/models.py | 21 |
3 files changed, 44 insertions, 4 deletions
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index c62922499..353ebbdbb 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -349,7 +349,7 @@ class FindTest(FindInit, TestCase): self.client = Client() self.client.login(username=self.username, password=self.password) - def testExternalID(self): + def test_external_id(self): find = self.finds[0] base_find = find.base_finds.all()[0] self.assertEqual( @@ -389,6 +389,29 @@ class FindTest(FindInit, TestCase): self.assertIn("PAT", find.external_id) self.assertIn("PAT", base_find.external_id) + find.label = "hop" + find.save() + find = models.Find.objects.get(pk=find.pk) + # default: {get_first_base_find__context_record__external_id}-{label} + self.assertEqual(find.external_id, u"PAT-12345-A1-new-label-too-hop") + profile = get_current_profile(force=True) + profile.find_external_id = \ + u"{get_first_base_find__context_record__external_id}-{label}-"\ + u"{label}" + profile.save() + find.save() + find = models.Find.objects.get(pk=find.pk) + self.assertEqual(find.external_id, + u"PAT-12345-A1-new-label-too-hop-hop") + profile.find_external_id = \ + u"{get_first_base_find__context_record__external_id}-{label}-" \ + u"{label}||lower||deduplicate" + profile.save() + find.save() + find = models.Find.objects.get(pk=find.pk) + self.assertEqual(find.external_id, + u"pat-12345-a1-new-label-too-hop") + def testIndex(self): profile = get_current_profile() profile.find_index = u"O" diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index e1bf43f5a..e5c77e501 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -946,7 +946,7 @@ class OperationTest(TestCase, OperationInitTest): ContextRecord.objects.create(label='CR-{}'.format(idx), operation=self.item) - def testExternalID(self): + def test_external_id(self): self.item.code_patriarche = '123456789' self.item.save() parcel = self.get_default_parcel() diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 8d0545885..d14e9b346 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1634,11 +1634,21 @@ class LightHistorizedItem(BaseHistorizedItem): PARSE_FORMULA = re.compile("{([^}]*)}") + +def _deduplicate(value): + new_values = [] + for v in value.split(u'-'): + if v not in new_values: + new_values.append(v) + return u'-'.join(new_values) + + FORMULA_FILTERS = { 'upper': lambda x: x.upper(), 'lower': lambda x: x.lower(), 'capitalize': lambda x: x.capitalize(), - 'slug': lambda x: slugify(x) + 'slug': lambda x: slugify(x), + 'deduplicate': _deduplicate } @@ -1675,7 +1685,14 @@ def get_external_id(key, item): dct[initial_key] = unicode(obj) for filtr in filters: dct[initial_key] = filtr(dct[initial_key]) - return formula.format(**dct) + values = formula.format(**dct).split('||') + value = values[0] + for filtr in values[1:]: + if filtr not in FORMULA_FILTERS: + value += u'||' + filtr + continue + value = FORMULA_FILTERS[filtr](value) + return value CURRENCY = ((u"€", _(u"Euro")), |