[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/Extensions/migrate_ptk.py I think we can get rid of PTK migration code now. :)

Tres Seaver tseaver at palladion.com
Sat Dec 27 16:44:50 EST 2008


Log message for revision 94388:
  I think we can get rid of PTK migration code now. :)

Changed:
  D   Products.CMFDefault/trunk/Products/CMFDefault/Extensions/migrate_ptk.py

-=-
Deleted: Products.CMFDefault/trunk/Products/CMFDefault/Extensions/migrate_ptk.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/Extensions/migrate_ptk.py	2008-12-27 21:06:10 UTC (rev 94387)
+++ Products.CMFDefault/trunk/Products/CMFDefault/Extensions/migrate_ptk.py	2008-12-27 21:44:49 UTC (rev 94388)
@@ -1,351 +0,0 @@
-from Acquisition import aq_base, aq_inner, aq_parent
-from Globals import PersistentMapping
-import sys
-
-
-#
-# Routines generally useful for migration purposes.
-#
-
-
-class Converter:
-    def allowDescendChildren(self): raise 'Not implemented'
-    def convert(self, ob): raise 'Not implemented'
-    def showDuplicationError(self): raise 'Not implemented'
-
-
-class Migrator:
-
-    def __init__(self, conversions, skip):
-        self.conversions = conversions
-        self.skip = skip
-        self.visited_folders = []
-        self.warnings = []
-        self.copied = []
-        self.skipped = []
-
-    def migrateObjectManager(self, src_folder, dst_folder, place=()):
-        self.visited_folders.append( '/'.join(place) )
-        for id, s_ob in src_folder.objectItems():
-            d_ob = getattr(dst_folder, id, None)
-            to_store = self.migrateObject(id, s_ob, d_ob, dst_folder,
-                                          place + (id,))
-            if to_store is not None:
-                owner = getattr(to_store, '_owner', None)
-                if hasattr(dst_folder, '_setObject'):
-                    dst_folder._setObject(id, to_store)
-                else:
-                    setattr(dst_folder, id, to_store)
-                if owner is not None:
-                    # Retain ownership.
-                    to_store._owner = owner
-
-    def migrateDiscussionContainer(self, src_folder, dst_folder, place=()):
-        self.visited_folders.append( '/'.join(place) )
-        dst_container = getattr(dst_folder, '_container', None)
-        if dst_container is None:
-            dst_container = dst_folder._container = PersistentMapping()
-        for id, s_ob in src_folder._container.items():
-            d_ob = dst_container.get(id)
-            to_store = self.migrateObject(id, s_ob, d_ob, dst_folder,
-                                          place + (id,))
-            if to_store is not None:
-                dst_container[id] = aq_base(to_store)
-
-    def migratePossibleContainer(self, s_ob, d_ob, place):
-        base_ob = aq_base(s_ob)
-        if hasattr(base_ob, 'objectItems'):
-            self.migrateObjectManager(s_ob, d_ob, place)
-        elif hasattr(base_ob, '_container'):
-            self.migrateDiscussionContainer(s_ob, d_ob, place)
-
-    def migrateObject(self, id, s_ob, d_ob, dst_folder, place):
-        # Doesn't store changes, only returns the
-        # object to store.
-        conversions = self.conversions
-        klass = s_ob.__class__
-        descend_ok = 1
-        base_ob = aq_base(s_ob)
-        to_store = None
-        pathname = '/'.join(place)
-        if self.skip.has_key(id):
-            # Don't migrate objects by this name, but we can still
-            # migrate subobjects.
-            descend_ok = self.skip[id]
-            if descend_ok and d_ob is None:
-                descend_ok = 0
-            self.skipped.append(pathname +
-                               (descend_ok and ' (descended)' or ' '))
-        elif d_ob is not None:
-            # The dest already has something with this ID.
-            descend_ok = 1
-            show_message = 1
-            converter = conversions.get(klass, None)
-            if converter is not None:
-                descend_ok = converter.allowDescendChildren()
-                show_message = converter.showDuplicationError()
-            if show_message:
-                self.warnings.append('Already existed: %s' % pathname)
-        elif conversions.has_key(klass):
-            # Invoke the appropriate converter.
-            converter = conversions[klass]
-            to_store = converter.convert(s_ob)
-            self.copied.append(pathname)
-        elif hasattr(base_ob, '_getCopy'):
-            # Make a direct copy.
-            to_store = s_ob._getCopy(dst_folder)
-            self.warnings.append('Copied %s directly.' % pathname)
-            descend_ok = 0
-        else:
-            # No way to copy.
-            descend_ok = 0
-            self.warnings.append('Could not copy %s' % pathname)
-        if descend_ok:
-            if to_store is not None:
-                d_ob = to_store
-            if d_ob is not None:
-                try: d_ob._p_jar = dst_folder._p_jar
-                except: pass
-                self.migratePossibleContainer(s_ob, d_ob, place)
-        return to_store
-
-
-class SimpleClassConverter (Converter):
-    def __init__(self, to_class, descend, show_dup=1):
-        self._klass = to_class
-        self._descend = descend
-        self._show_dup = show_dup
-
-    def allowDescendChildren(self):
-        return self._descend
-
-    def showDuplicationError(self):
-        return self._show_dup
-
-    def convert(self, ob):
-        # Creates a copy of ob without its children.
-        ob = aq_base(ob)
-        k = self._klass
-        if hasattr(k, '__basicnew__'):
-            newob = k.__basicnew__()
-        else:
-            newob = new.instance(k, {})
-        id = ob.id
-        if callable(id):
-            id = id()
-        try: newob._setId(id)
-        except AttributeError: newob.id = id
-        newob.__dict__.update(ob.__dict__)
-        if hasattr(newob, '_objects'):
-            # Clear the children.
-            for info in newob._objects:
-                del newob.__dict__[info['id']]
-            newob._objects = ()
-        if hasattr(newob, '_container'):
-            # Clear the children.
-            newob._container = PersistentMapping()
-        return newob
-
-TupleType = type(())
-
-def setupDirectConversion(old_prod, new_prod, modname, classname,
-                          conversions, descend=1, show_dup=1):
-    try:
-        old_module = sys.modules['Products.' + old_prod + '.' + modname]
-        new_module = sys.modules['Products.' + new_prod + '.' + modname]
-        old_class = getattr(old_module, classname)
-        new_class = getattr(new_module, classname)
-        conversions[old_class] = SimpleClassConverter(new_class, descend,
-                                                      show_dup)
-    except:
-        print 'Failed to set up conversion', old_prod, new_prod, modname, classname
-        import traceback
-        traceback.print_exc()
-
-
-def setupDirectConversions(old_prod, new_prod, modnames, conversions):
-    for info in modnames:
-        if type(info) is TupleType:
-            modname, classname = info
-        else:
-            modname = classname = info
-        setupDirectConversion(old_prod, new_prod, modname, classname,
-                              conversions)
-
-
-def _cleanupOwnership(ob, res, cleanup_children):
-    '''
-    If the user name of the owner of the referenced object
-    is not found in its current user database but is found
-    in the local user database, this function changes the
-    ownership of the object to the local database.
-    '''
-    try: changed = ob._p_changed
-    except: changed = 0
-
-    owner = getattr(ob, '_owner', None)
-    if owner:
-        udb, uid = owner
-        #res.append('Owner of %s is %s!%s' % (
-        #    '/'.join( ob.getPhysicalPath() ), '/'.join(udb), uid,))
-        root = ob.getPhysicalRoot()
-        try:
-            db = root.unrestrictedTraverse(udb, None)
-            user = db.getUserById(uid)
-            if hasattr(ob, 'aq_inContextOf'):
-                ucontext = aq_parent(aq_inner(db))
-                if not ob.aq_inContextOf(ucontext):
-                    # Not in the right context.
-                    user = None
-        except:
-            user = None
-        if user is None:
-            # Try to change to a local database.
-            p = ob
-            old_udb = udb
-            udb = None
-            while p is not None:
-                if hasattr(p, 'acl_users'):
-                    acl_users = p.acl_users
-                    try:
-                        user = acl_users.getUserById(uid)
-                    except:
-                        user = None
-                    if user is not None:
-                        # Found the right database.
-                        udb = acl_users.getPhysicalPath()[1:]
-                        break
-                p = aq_parent(aq_inner(p))
-            if udb is not None:
-                ob._owner = udb, uid
-                res.append('Changed ownership of %s from %s!%s to %s!%s' %
-                           ('/'.join( ob.getPhysicalPath() ),
-                            '/'.join(old_udb), uid,
-                            '/'.join(udb), uid,))
-            else:
-                res.append('Could not fix the ownership of %s, '
-                           'which is set to %s!%s' %
-                           ('/'.join( ob.getPhysicalPath() ),
-                            '/'.join(old_udb), uid,))
-
-    if cleanup_children:
-        if hasattr(ob, 'objectValues'):
-            for subob in ob.objectValues():
-                _cleanupOwnership(subob, res, 1)
-
-    # Deactivate object if possible.
-    if changed is None: ob._p_deactivate()
-
-    return res
-
-def _copyUsers(src_folder, dst_folder):
-    source = src_folder.acl_users
-    target = dst_folder.acl_users
-    for user in source.getUsers():
-        target._addUser(name=user.name, password=user.__, confirm=user.__,
-                        roles=user.roles, domains=user.domains, REQUEST=None)
-
-#
-# PTK to CMF Migration script.
-#
-
-
-def migrate(self, src_path='', dest_path='', copy_users=0, ownership_only=0):
-    if not src_path or not dest_path:
-        return '''
-        <html><body><form action="%s" method="POST">
-        <h2>Migrate PTK content to CMF site</h2>
-        <p>Path (not including server URL) to PTK instance (source):
-        <input type="text" name="src_path"></p>
-        <p>Path (not including server URL) to CMF site (destination):
-        <input type="text" name="dest_path"></p>
-        <p>Copy users:
-        <input type="checkbox" name="copy_users" value="1"></p>
-        <input type="submit" name="submit" value="Migrate">
-        <input type="submit" name="ownership_only"
-        value="Just clean up ownership">
-        </form></body></html>
-        ''' % self.REQUEST['URL']
-    root = self.getPhysicalRoot()
-    dst_folder = root.restrictedTraverse(dest_path)
-    if not ownership_only:
-        src_folder = root.restrictedTraverse(src_path)
-        if copy_users:
-            _copyUsers(src_folder, dst_folder)
-        m = Migrator(ptk2cmf_conversions, ptk2cmf_skip)
-        m.migrateObjectManager(src_folder, dst_folder)
-    ownership_res = []
-    _cleanupOwnership(dst_folder, ownership_res, 1)
-    return '''
-        <html><body><p>Finished migration.</p>
-        <p>Warnings (if any):<ul><li>%s</li></ul></p>
-        <p>Visited folders:<ul><li>%s</li></ul></p>
-        <p>Skipped:<ul><li>%s</li></ul></p>
-        <p>Converted content:</p><pre>%s</pre>
-        <p>Fixed up ownership:</p><pre>%s</pre>
-        </body></html>
-        ''' % ('</li>\n<li>'.join(m.warnings),
-               '</li>\n<li>'.join(m.visited_folders),
-               '</li>\n<li>'.join(m.skipped),
-               '\n'.join(m.copied),
-               '\n'.join(ownership_res),
-               )
-
-migrate_ptk = migrate
-
-#
-# PTK to CMF Conversion definitions.
-#
-
-
-ptk2cmf_conversions = {}
-
-ptk2cmf_skip = {
-    'portal_actions':0,
-    'portal_catalog':0,
-    'portal_discussion':0,
-    'portal_memberdata':0,
-    'portal_membership':0,
-    'portal_properties':0,
-    'portal_registration':0,
-    'portal_skins':1,
-    'portal_types':0,
-    'portal_undo':0,
-    'portal_url':0,
-    'portal_workflow':0,
-    'MailHost':0,
-    'cookie_authentication':0,
-    }
-
-demo_conversions = (
-    'Document',
-    'NewsItem',
-    'Image',
-    'File',
-    'Link',
-    'Favorite',
-    'DiscussionItem',
-    ('DiscussionItem', 'DiscussionItemContainer'),
-    )
-
-
-BEFORE_CONTENT_MOVE = 0
-
-if BEFORE_CONTENT_MOVE:
-    content_product = 'PTKBase'
-else:
-    content_product = 'PTKDemo'
-
-
-setupDirectConversions(content_product, 'CMFDefault', demo_conversions,
-                       ptk2cmf_conversions)
-
-setupDirectConversion('PTKBase', 'CMFCore', 'DirectoryView', 'DirectoryView',
-                       ptk2cmf_conversions, 0, 0)
-
-setupDirectConversion('PTKBase', 'CMFCore', 'PortalFolder', 'PortalFolder',
-                       ptk2cmf_conversions, 1)
-
-from OFS.Folder import Folder
-from Products.CMFCore.PortalFolder import PortalFolder
-ptk2cmf_conversions[Folder] = SimpleClassConverter(PortalFolder, 1)



More information about the Checkins mailing list