From b06baacc34eca7dae6c1abb893d418f1c7adcd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 14 May 2015 20:56:35 +0200 Subject: [PATCH 1/2] misc: add slug to roles (#7180) --- tests/test_role.py | 38 ++++++++++++++++++++++++++++++++++++++ wcs/roles.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 tests/test_role.py diff --git a/tests/test_role.py b/tests/test_role.py new file mode 100644 index 0000000..ff5aa51 --- /dev/null +++ b/tests/test_role.py @@ -0,0 +1,38 @@ +import cPickle + +from utilities import create_temporary_pub, clean_temporary_pub + +from qommon.storage import StorableObject +from wcs.roles import Role + +def setup_module(module): + pub = create_temporary_pub() + pub.cfg['language'] = {'language': 'en'} + +def teardown_module(module): + clean_temporary_pub() + +def test_slug(): + Role.wipe() + role = Role(name='Hello world') + role.store() + assert role.slug == 'hello-world' + +def test_duplicated_name(): + Role.wipe() + role = Role(name='Hello world') + role.store() + assert role.slug == 'hello-world' + role = Role(name='Hello world') + role.store() + assert role.slug == 'hello-world-1' + +def test_migrate(): + Role.wipe() + role = Role(name='Hello world') + role.store() + obj = cPickle.load(open(role.get_object_filename())) + del obj.slug + cPickle.dump(obj, open(role.get_object_filename(), 'w')) + assert cPickle.load(open(role.get_object_filename())).slug is None + assert Role.get(role.id).slug == 'hello-world' diff --git a/wcs/roles.py b/wcs/roles.py index 98a6379..3ac9954 100644 --- a/wcs/roles.py +++ b/wcs/roles.py @@ -21,7 +21,10 @@ import qommon.misc class Role(StorableObject): _names = 'roles' + _indexes = ['slug'] + name = None + slug = None details = None emails = None emails_to_members = False @@ -31,6 +34,35 @@ class Role(StorableObject): StorableObject.__init__(self) self.name = name + def migrate(self): + changed = False + if not self.slug: + # .store() will take care of setting the slug + changed = True + if changed: + self.store() + + def store(self): + if self.slug is None: + # set slug if it's not yet there + self.slug = self.get_new_slug() + super(Role, self).store() + + def get_new_slug(self): + new_slug = qommon.misc.simplify(self.name) + base_new_slug = new_slug + suffix_no = 0 + while True: + try: + role = self.get_on_index(new_slug, 'slug', ignore_migration=True) + except KeyError: + break + if role.id == self.id: + break + suffix_no += 1 + new_slug = '%s-%s' % (base_new_slug, suffix_no) + return new_slug + def get_emails(self): emails = self.emails or [] if not self.emails_to_members: -- 2.1.4