Skip to content

Commit

Permalink
Added transmogrifier.correct_id to generate a unexisting id with nu…
Browse files Browse the repository at this point in the history
…mbered or lettered suffix
  • Loading branch information
sgeulette committed Sep 20, 2023
1 parent 18a6036 commit bfe753c
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 2 deletions.
4 changes: 2 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Changelog
0.76 (unreleased)
-----------------

- Nothing changed yet.

- Added `transmogrifier.correct_id` to generate a unexisting id with numbered or lettered suffix.
[sgeulette]

0.75 (2023-09-04)
-----------------
Expand Down
23 changes: 23 additions & 0 deletions src/imio/helpers/tests/test_transmogrifier.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from imio.helpers.testing import IntegrationTestCase
from imio.helpers.transmogrifier import clean_value
from imio.helpers.transmogrifier import correct_id
from imio.helpers.transmogrifier import correct_path
from imio.helpers.transmogrifier import filter_keys
from imio.helpers.transmogrifier import get_main_path
Expand Down Expand Up @@ -39,6 +40,28 @@ def test_clean_value(self):
self.assertEqual(clean_value(u' stri p \n line 2', patterns=[(r'\s{2,}', u' ')], osep=u'-'),
u'stri p-line 2')

def test_correct_id(self):
self.assertEquals(correct_id(self.portal, 'abcde'), 'abcde')
self.assertIn('folder', self.portal.objectIds())
self.assertEquals(correct_id(self.portal, 'folder'), 'folder-1')
self.assertEquals(correct_id(self.portal, 'folder', with_letter=True), 'folder-a')
self.assertEquals(correct_id(self.portal.folder, 'abcde'), 'abcde')
self.portal.folder.invokeFactory('Document', id='abcde', title='Document')
self.assertEquals(correct_id(self.portal.folder, 'abcde'), 'abcde-1')
self.assertEquals(correct_id(self.portal.folder, 'abcde', True), 'abcde-a')
self.portal.folder.invokeFactory('Document', id='abcde-1', title='Document')
self.assertEquals(correct_id(self.portal.folder, 'abcde'), 'abcde-2')

def test_correct_id_dic(self):
lst = ['a']
self.assertEquals(correct_id(lst, 'z'), 'z')
self.assertEquals(correct_id(lst, 'a'), 'a-1')
self.assertEquals(correct_id(lst, 'a', True), 'a-a')
lst.extend(['a-1', 'a-a'])
self.assertEquals(correct_id(lst, 'a'), 'a-2')
self.assertEquals(correct_id(lst, 'a', True), 'a-b')


def test_correct_path(self):
self.assertEquals(correct_path(self.portal, 'abcde'), 'abcde')
self.assertIn('folder', self.portal.objectIds())
Expand Down
23 changes: 23 additions & 0 deletions src/imio/helpers/transmogrifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,29 @@ def clean_value(value, isep=u'\n', strip=u' ', patterns=[], osep=None):
return osep.join(parts)


def correct_id(obj, oid, with_letter=False):
""" Modify an id already existing in obj.
:param obj: plone obj or dict or list
:param oid: id to check
:param with_letter: add a letter prefix
:return: unique id
"""
# TODO handle more than 26 letters
letters = 'abcdefghijklmnopqrstuvwxyz'
original = oid
i = 0
pfx = with_letter and letters[i] or i + 1
while oid in obj:
oid = u'{}-{}'.format(original, pfx)
i += 1
if with_letter:
pfx = letters[i-1]
else:
pfx = i + 1
return oid


def correct_path(portal, path):
""" Check if a path already exists on obj """
original = path
Expand Down

0 comments on commit bfe753c

Please sign in to comment.