diff -r a2ccbcbb08a6 -r 24bf6f181d0e misc/migration/3.11.0_Any.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/migration/3.11.0_Any.py Wed Dec 01 17:11:35 2010 +0100 @@ -0,0 +1,57 @@ +sync_schema_props_perms('cw_support', syncperms=False) +sync_schema_props_perms('cw_dont_cross', syncperms=False) +sync_schema_props_perms('cw_may_cross', syncperms=False) + +try: + from cubicweb.server.sources.pyrorql import PyroRQLSource +except ImportError: + pass +else: + + from os.path import join + + def load_mapping_file(source): + mappingfile = source.config['mapping-file'] + mappingfile = join(source.repo.config.apphome, mappingfile) + mapping = {} + execfile(mappingfile, mapping) + for junk in ('__builtins__', '__doc__'): + mapping.pop(junk, None) + mapping.setdefault('support_relations', {}) + mapping.setdefault('dont_cross_relations', set()) + mapping.setdefault('cross_relations', set()) + # do some basic checks of the mapping content + assert 'support_entities' in mapping, \ + 'mapping file should at least define support_entities' + assert isinstance(mapping['support_entities'], dict) + assert isinstance(mapping['support_relations'], dict) + assert isinstance(mapping['dont_cross_relations'], set) + assert isinstance(mapping['cross_relations'], set) + unknown = set(mapping) - set( ('support_entities', 'support_relations', + 'dont_cross_relations', 'cross_relations') ) + assert not unknown, 'unknown mapping attribute(s): %s' % unknown + # relations that are necessarily not crossed + for rtype in ('is', 'is_instance_of', 'cw_source'): + assert rtype not in mapping['dont_cross_relations'], \ + '%s relation should not be in dont_cross_relations' % rtype + assert rtype not in mapping['support_relations'], \ + '%s relation should not be in support_relations' % rtype + return mapping + + for source in repo.sources_by_uri.values(): + if not isinstance(source, PyroRQLSource): + continue + mapping = load_mapping_file(source) + print 'migrating map for', source + for etype in mapping['support_entities']: # XXX write support + rql('SET S cw_support ET WHERE ET name %(etype)s, ET is CWEType, S eid %(s)s', + {'etype': etype, 's': source.eid}) + for rtype in mapping['support_relations']: # XXX write support + rql('SET S cw_support RT WHERE RT name %(rtype)s, RT is CWRType, S eid %(s)s', + {'rtype': rtype, 's': source.eid}) + for rtype in mapping['dont_cross_relations']: # XXX write support + rql('SET S cw_dont_cross RT WHERE RT name %(rtype)s, S eid %(s)s', + {'rtype': rtype, 's': source.eid}) + for rtype in mapping['cross_relations']: # XXX write support + rql('SET S cw_may_cross RT WHERE RT name %(rtype)s, S eid %(s)s', + {'rtype': rtype, 's': source.eid})