diff -r 000000000000 -r b97547f5f1fa goa/dbinit.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/goa/dbinit.py Wed Nov 05 15:52:50 2008 +0100 @@ -0,0 +1,108 @@ +"""some utility functions for datastore initialization. + +:organization: Logilab +:copyright: 2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr +""" +__docformat__ = "restructuredtext en" + +from google.appengine.api.datastore import Key, Entity, Put, Get, Query +from google.appengine.api import datastore_errors + +_GROUP_CACHE = {} # XXX use memcache + +def _get_group(groupname): + try: + return _GROUP_CACHE[groupname] + except KeyError: + key = Key.from_path('EGroup', 'key_' + groupname, parent=None) + try: + group = Get(key) + except datastore_errors.EntityNotFoundError: + raise Exception('can\'t find required group %s, is your application ' + 'correctly initialized (eg did you run the ' + 'initialization script) ?' % groupname) + _GROUP_CACHE[groupname] = group + return group + + +def create_user(login, password, groups): + """create a cubicweb user""" + from cubicweb.server.utils import crypt_password + user = Entity('EUser', name=login) + user['s_login'] = unicode(login) + user['s_upassword'] = crypt_password(password) + set_user_groups(user, groups) + Put(user) + return user + +def create_groups(): + """create initial cubicweb groups""" + for groupname in ('managers', 'users', 'guests'): + group = Entity('EGroup', name='key_' + groupname) + group['s_name'] = unicode(groupname) + Put(group) + _GROUP_CACHE[groupname] = group + +def set_user_groups(user, groups): + """set user in the given groups (as string). The given user entity + (datastore.Entity) is not putted back to the repository, this is the caller + responsability. + """ + groups = [_get_group(g) for g in groups] + user['s_in_group'] = [g.key() for g in groups] or None + for group in groups: + try: + group['o_in_group'].append(user.key()) + except (KeyError, AttributeError): + group['o_in_group'] = [user.key()] + Put(group) + +def init_relations(gaeentity, eschema): + """set None for every subject relations which is not yet defined""" + for rschema in eschema.subject_relations(): + if rschema in ('identity', 'has_text'): + continue + dsrelation = 's_' + rschema.type + if not dsrelation in gaeentity: + gaeentity[dsrelation] = None + for rschema in eschema.object_relations(): + if rschema == 'identity': + continue + dsrelation = 'o_' + rschema.type + if not dsrelation in gaeentity: + gaeentity[dsrelation] = None + +def fix_entities(schema): + for etype in ('EUser', 'EGroup'): + eschema = schema.eschema(etype) + for gaeentity in Query(etype).Run(): + init_relations(gaeentity, eschema) + # XXX o_is on EEType entity + gaeentity['s_is'] = Key.from_path('EEType', 'key_' + etype, parent=None) + Put(gaeentity) + +def init_persistent_schema(ssession, schema): + execute = ssession.unsafe_execute + rql = ('INSERT EEType X: X name %(name)s, X description %(descr)s,' + 'X final FALSE, X meta %(meta)s') + eschema = schema.eschema('EEType') + execute(rql, {'name': u'EEType', 'descr': unicode(eschema.description), + 'meta': eschema.meta}) + for eschema in schema.entities(): + if eschema.is_final() or eschema == 'EEType': + continue + execute(rql, {'name': unicode(eschema), 'meta': eschema.meta, + 'descr': unicode(eschema.description)}) + +def insert_versions(ssession, config): + execute = ssession.unsafe_execute + # insert versions + execute('INSERT EProperty X: X pkey %(pk)s, X value%(v)s', + {'pk': u'system.version.cubicweb', + 'v': unicode(config.cubicweb_version())}) + for cube in config.cubes(): + execute('INSERT EProperty X: X pkey %(pk)s, X value%(v)s', + {'pk': u'system.version.%s' % cube, + 'v': unicode(config.cube_version(cube))}) +