3 # Copyright 2011 GRNET S.A. All rights reserved.
5 # Redistribution and use in source and binary forms, with or
6 # without modification, are permitted provided that the following
9 # 1. Redistributions of source code must retain the above
10 # copyright notice, this list of conditions and the following
13 # 2. Redistributions in binary form must reproduce the above
14 # copyright notice, this list of conditions and the following
15 # disclaimer in the documentation and/or other materials
16 # provided with the distribution.
18 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
31 # The views and conclusions contained in the software and
32 # documentation are those of the authors and should not be
33 # interpreted as representing official policies, either expressed
34 # or implied, of GRNET S.A.
36 from lib.migrate import Migration
38 from sqlalchemy import Table
39 from sqlalchemy.sql import select
41 from pithos.im.models import User
45 class UserMigration(Migration):
46 def __init__(self, db):
47 Migration.__init__(self, db)
48 self.gss_users = Table('gss_user', self.metadata, autoload=True)
51 for u in self.retrieve_users():
54 user.uniq = u['username']
55 user.realname = u['name']
56 user.affiliation = u['homeorganization'] if u['homeorganization'] else ''
57 user.auth_token = base64.b64encode(u['authtoken'])
58 user.auth_token_created = u['creationdate']
59 user.auth_token_expires = u['authtokenexpirydate']
60 user.created = u['creationdate']
61 user.updated = u['modificationdate']
62 user.email = u['email']
63 user.active = 'ACTIVE' if u['active'] else 'SUSPENDED'
65 user.save(update_timestamps=False)
68 for (owner, group, members) in self.retrieve_groups(u['username']):
69 self.backend.permissions.group_addmany(owner, group, members)
72 def retrieve_users(self):
73 s = self.gss_users.select()
74 rp = self.conn.execute(s)
81 def retrieve_groups(self, owner):
82 gss_group = Table('gss_group', self.metadata, autoload=True)
83 gss_user = Table('gss_user', self.metadata, autoload=True)
84 group_user = Table('gss_group_gss_user', self.metadata, autoload=True)
85 j1 = gss_group.join(gss_user, gss_group.c.owner_id == gss_user.c.id)
86 j2 = group_user.join(gss_user, group_user.c.members_id == gss_user.c.id)
87 s = select([gss_group.c.id, gss_group.c.name, gss_user.c.username], from_obj=j1)
88 s = s.where(gss_user.c.username == owner)
89 rp = self.conn.execute(s)
93 s = select([gss_user.c.username], from_obj=j2)
94 s = s.where(group_user.c.groupsmember_id == id)
95 rp2 = self.conn.execute(s)
96 members = rp2.fetchall()
98 yield owner, group, (m[0] for m in members)
102 if __name__ == "__main__":
104 m = UserMigration(db)