misc/migration/3.11.0_Any.py
changeset 6724 24bf6f181d0e
child 6944 0cf10429ad39
--- /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})