"""some utility functions for datastore initialization.:organization: Logilab:copyright: 2008-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"fromgoogle.appengine.api.datastoreimportKey,Entity,Put,Get,Queryfromgoogle.appengine.apiimportdatastore_errors_GROUP_CACHE={}# XXX use memcachedef_get_group(groupname):try:return_GROUP_CACHE[groupname]exceptKeyError:key=Key.from_path('CWGroup','key_'+groupname,parent=None)try:group=Get(key)exceptdatastore_errors.EntityNotFoundError:raiseException('can\'t find required group %s, is your instance ''correctly initialized (eg did you run the ''initialization script) ?'%groupname)_GROUP_CACHE[groupname]=groupreturngroupdefcreate_user(login,password,groups):"""create a cubicweb user"""fromcubicweb.server.utilsimportcrypt_passworduser=Entity('CWUser',name=login)user['s_login']=unicode(login)user['s_upassword']=crypt_password(password)set_user_groups(user,groups)Put(user)returnuserdefcreate_groups():"""create initial cubicweb groups"""forgroupnamein('managers','users','guests'):group=Entity('CWGroup',name='key_'+groupname)group['s_name']=unicode(groupname)Put(group)_GROUP_CACHE[groupname]=groupdefset_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)forgingroups]user['s_in_group']=[g.key()forgingroups]orNoneforgroupingroups:try:group['o_in_group'].append(user.key())except(KeyError,AttributeError):group['o_in_group']=[user.key()]Put(group)definit_relations(gaeentity,eschema):"""set None for every subject relations which is not yet defined"""forrschemaineschema.subject_relations():ifrschemain('identity','has_text'):continuedsrelation='s_'+rschema.typeifnotdsrelationingaeentity:gaeentity[dsrelation]=Noneforrschemaineschema.object_relations():ifrschema=='identity':continuedsrelation='o_'+rschema.typeifnotdsrelationingaeentity:gaeentity[dsrelation]=Nonedeffix_entities(schema):foretypein('CWUser','CWGroup'):eschema=schema.eschema(etype)forgaeentityinQuery(etype).Run():init_relations(gaeentity,eschema)# XXX o_is on CWEType entitygaeentity['s_is']=Key.from_path('CWEType','key_'+etype,parent=None)Put(gaeentity)definit_persistent_schema(ssession,schema):execute=ssession.unsafe_executerql=('INSERT CWEType X: X name %(name)s, X description %(descr)s,''X final FALSE')eschema=schema.eschema('CWEType')execute(rql,{'name':u'CWEType','descr':unicode(eschema.description)})foreschemainschema.entities():ifeschema.is_final()oreschema=='CWEType':continueexecute(rql,{'name':unicode(eschema),'descr':unicode(eschema.description)})definsert_versions(ssession,config):execute=ssession.unsafe_execute# insert versionsexecute('INSERT CWProperty X: X pkey %(pk)s, X value%(v)s',{'pk':u'system.version.cubicweb','v':unicode(config.cubicweb_version())})forcubeinconfig.cubes():execute('INSERT CWProperty X: X pkey %(pk)s, X value%(v)s',{'pk':u'system.version.%s'%cube,'v':unicode(config.cube_version(cube))})