misc: add slug to roles (#7180)

This commit is contained in:
Frédéric Péters 2015-05-14 20:56:35 +02:00
parent 6841713c2f
commit 6a25e750d0
2 changed files with 70 additions and 0 deletions

38
tests/test_role.py Normal file
View File

@ -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'

View File

@ -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: