[zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.16

Sidnei da Silva sidnei at x3ng.com.br
Tue Feb 18 15:47:14 EST 2003


Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv17016/Extensions

Modified Files:
	NZOMigrate.py 
Log Message:
More fixes to migration. New helper methods to fix ownership and publishing. A typo (HowTo -> How-To).

=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.15 => 1.16 ===
                     "Image": "CMF Default Image",
                     "File": "CMF Default File",
                     "Tip": "ZopeOrg Tip",
-                    "HowTo": "ZopeOrg HowTo",
+                    "How-To": "ZopeOrg HowTo",
                     "Software Product": "CMF Software Package",
                     "Product Release": "CMF Software Release",
                     "Tracker": "CMF Collector",
@@ -120,12 +120,120 @@
     
     return res
 
+def recursiveOwnerFix(ob, new_uid=None, fix_children=0):
+    try: changed = ob._p_changed
+    except: changed = 0
+
+    if ob is None:
+        return
+
+    try:
+        owner = ob.getOwner(info=1)
+    except:
+        owner = None
+
+    udb = None
+    uid = None
+    root = ob.getPhysicalRoot()
+    if owner:
+        udb, uid = owner
+    if not new_uid: return
+    p = ob
+    old_udb = udb
+    udb = None
+    if new_uid != uid:
+        while p is not None:
+            if hasattr(p, 'acl_users'):
+                acl_users = getattr(p, 'acl_users')
+                try:
+                    user = acl_users.getUserById(new_uid).__of__(acl_users)
+                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.changeOwnership(user)
+            log('Changed ownership of %s from %s!%s to %s!%s.\n' %
+                       ('/'.join(ob.getPhysicalPath()),
+                        '/'.join(old_udb), uid,
+                        '/'.join(udb), user,))
+        else:
+            log('Could not fix the ownership of %s, '
+                       'which is set to %s!%s.\n' %
+                       ('/'.join(ob.getPhysicalPath()),
+                        '/'.join(old_udb), uid,))
+
+    if fix_children:
+        if hasattr(ob, 'objectValues'):
+            for subob in ob.objectValues():
+                recursiveOwnerFix(subob, new_uid, 1)
+    # Deactivate object if possible.
+    if changed is None: ob._p_deactivate()
+
+    return
+
+def log(message, summary='', severity=0, dup=1):
+    zLOG.LOG('NZOMigration: ',severity,summary,message)
+
+def setLocalRoles(self, ids, role):
+    pm = getToolByName(self, 'portal_membership')
+    try:
+        pm.setLocalRoles( self
+                          , member_ids=ids
+                          , member_role=role
+                          )
+        log('Set roles %s for %s on %s.\n' %
+            (role, ids, self.absolute_url(relative=1)))
+    except:
+        log('Failed to set roles %s for %s on %s.\n' %
+            (role, ids, self.absolute_url(relative=1)))
+        
+
+def fixMembers(self, skip=None):
+    members = self.Members.objectIds()
+    if skip is None:
+        skip = []
+    members = [id for id in members if not id in skip]
+    members.sort()
+    for id in members:
+        log('Starting recursiveFixOwnership in Members/%s. \n' % id)
+        folder = getattr(self.Members, id, None)
+        if folder.meta_type not in ['Folder', 'Portal Folder', 'BTreeFolder2', 'Plone Folder']:
+            continue
+        res = recursiveOwnerFix(folder, id, 1)
+        setLocalRoles(folder, (id, ), 'Owner')
+        updateRoleMappings(folder)
+        massPublish(folder)
+        log('Finished recursiveFixOwnership in Members/%s. \n' % id)
+        get_transaction().commit()
+    return 'Done!'
+
+def updateRoleMappings(self):
+
+    """ Allow workflows to update the role-permission mappings.
+    """
+    wfs = {}
+    wf_tool = getToolByName(self, 'portal_workflow')
+    for id in wf_tool.objectIds():
+        wf = wf_tool.getWorkflowById(id)
+        if hasattr(aq_base(wf), 'updateRoleMappingsFor'):
+            wfs[id] = wf
+    count = wf_tool._recursiveUpdateRoleMappings(self, wfs)
+    log('updateRoleMappings: %d object(s) updated.\n' % count)
+    return count
+
 def massPublish(self):
     wf_tool = getToolByName(self, 'portal_workflow')
+    try:
+        wf_tool.doActionFor(self, 'publish')
+        log('Published %s.\n' % self.getId())
+    except: pass
+    get_transaction().commit()
     if hasattr(self, 'objectValues'):
         for subob in self.objectValues():
-            try: wf_tool.doActionFor(subob, 'publish')
-            except: pass
             massPublish(subob)
 
 def filterList(alist):
@@ -176,6 +284,8 @@
         if hasattr(aq_base(root), id):
             logo_id = '%s_logo' % id
             root.manage_renameObject(id=id, new_id=logo_id)
+        else:
+            logo_id = ''
         try:
             root.invokeFactory(id=id, type_name='Zope Service Provider')
         except:
@@ -655,9 +765,10 @@
                 if type in ('selection', 'multiple selection'):
                     for p in orig._properties:
                         if p['id'] == prop:
-                            value = p['select_variable']
-                        if not hasattr(new, value):
-                            setattr(new, value, [])
+                            value = str(p['select_variable'])
+                            break
+                    if not hasattr(aq_base(new), value):
+                        setattr(new, str(value), [])
                 else:
                     try:
                         value = orig.getProperty(prop)





More information about the zopeorg-checkins mailing list