Projet

Général

Profil

0001-misc-add-slug-to-roles-7180.patch

Frédéric Péters, 15 mai 2015 10:00

Télécharger (3,01 ko)

Voir les différences:

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
tests/test_role.py
1
import cPickle
2

  
3
from utilities import create_temporary_pub, clean_temporary_pub
4

  
5
from qommon.storage import StorableObject
6
from wcs.roles import Role
7

  
8
def setup_module(module):
9
    pub = create_temporary_pub()
10
    pub.cfg['language'] = {'language': 'en'}
11

  
12
def teardown_module(module):
13
    clean_temporary_pub()
14

  
15
def test_slug():
16
    Role.wipe()
17
    role = Role(name='Hello world')
18
    role.store()
19
    assert role.slug == 'hello-world'
20

  
21
def test_duplicated_name():
22
    Role.wipe()
23
    role = Role(name='Hello world')
24
    role.store()
25
    assert role.slug == 'hello-world'
26
    role = Role(name='Hello world')
27
    role.store()
28
    assert role.slug == 'hello-world-1'
29

  
30
def test_migrate():
31
    Role.wipe()
32
    role = Role(name='Hello world')
33
    role.store()
34
    obj = cPickle.load(open(role.get_object_filename()))
35
    del obj.slug
36
    cPickle.dump(obj, open(role.get_object_filename(), 'w'))
37
    assert cPickle.load(open(role.get_object_filename())).slug is None
38
    assert Role.get(role.id).slug == 'hello-world'
wcs/roles.py
21 21

  
22 22
class Role(StorableObject):
23 23
    _names = 'roles'
24
    _indexes = ['slug']
25

  
24 26
    name = None
27
    slug = None
25 28
    details = None
26 29
    emails = None
27 30
    emails_to_members = False
......
31 34
        StorableObject.__init__(self)
32 35
        self.name = name
33 36

  
37
    def migrate(self):
38
        changed = False
39
        if not self.slug:
40
            # .store() will take care of setting the slug
41
            changed = True
42
        if changed:
43
            self.store()
44

  
45
    def store(self):
46
        if self.slug is None:
47
            # set slug if it's not yet there
48
            self.slug = self.get_new_slug()
49
        super(Role, self).store()
50

  
51
    def get_new_slug(self):
52
        new_slug = qommon.misc.simplify(self.name)
53
        base_new_slug = new_slug
54
        suffix_no = 0
55
        while True:
56
            try:
57
                role = self.get_on_index(new_slug, 'slug', ignore_migration=True)
58
            except KeyError:
59
                break
60
            if role.id == self.id:
61
                break
62
            suffix_no += 1
63
            new_slug = '%s-%s' % (base_new_slug, suffix_no)
64
        return new_slug
65

  
34 66
    def get_emails(self):
35 67
        emails = self.emails or []
36 68
        if not self.emails_to_members:
37
-