1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
from Products.GroupUserFolder import groupuserfolder_globals
from Products.GroupUserFolder.GroupUserFolder import GroupUserFolder
from StringIO import StringIO
from Products.CMFCore.utils import getToolByName
from Products.CMFCore.DirectoryView import addDirectoryViews
from Acquisition import aq_base
from OFS.Folder import manage_addFolder
SKIN_NAME = "gruf"
_globals = globals()
def install_plone(self, out):
pass
def install_subskin(self, out, skin_name=SKIN_NAME, globals=groupuserfolder_globals):
print >>out, " Installing subskin."
skinstool=getToolByName(self, 'portal_skins')
if skin_name not in skinstool.objectIds():
print >>out, " Adding directory view for GRUF"
addDirectoryViews(skinstool, 'skins', globals)
for skinName in skinstool.getSkinSelections():
path = skinstool.getSkinPath(skinName)
path = [i.strip() for i in path.split(',')]
try:
if skin_name not in path:
path.insert(path.index('custom') +1, skin_name)
except ValueError:
if skin_name not in path:
path.append(skin_name)
path = ','.join(path)
skinstool.addSkinSelection( skinName, path)
print >>out, " Done installing subskin."
def walk(out, obj, operation):
if obj.isPrincipiaFolderish:
for content in obj.objectValues():
walk(out, content, operation)
operation(out, obj)
def migrate_user_folder(obj, out, ):
"""
Move a user folder into a temporary folder, create a GroupUserFolder,
and then move the old user folder into the Users portion of the GRUF.
NOTE: You cant copy/paste between CMF and Zope folder. *sigh*
"""
id = obj.getId()
if id == 'acl_users':
if obj.__class__.__name__ == "GroupUserFolder":
# Avoid already-created GRUFs
print >>out, " Do NOT migrate acl_users at %s, as it is already a GroupUserFolder" % ('/'.join( obj.getPhysicalPath() ), )
return out.getvalue()
print >>out, " Migrating acl_users folder at %s to a GroupUserFolder" % ('/'.join( obj.getPhysicalPath() ), )
container = obj.aq_parent
# Instead of using Copy/Paste we hold a reference to the acl_users
# and use that reference instead of physically moving objects in ZODB
tmp_users=container._getOb('acl_users')
tmp_allow=container.__allow_groups__
del container.__allow_groups__
if 'acl_users' in container.objectIds():
container.manage_delObjects('acl_users')
container.manage_addProduct['GroupUserFolder'].manage_addGroupUserFolder()
container.acl_users.Users.manage_delObjects( 'acl_users' )
container.acl_users.Users._setObject('acl_users', aq_base(tmp_users))
container.__allow_groups__ = aq_base(getattr(container,'acl_users'))
return out.getvalue()
def migrate_plone_site_to_gruf(self, out = None):
if out is None:
out = StringIO()
print >>out, " Attempting to migrate UserFolders to GroupUserFolders..."
urltool=getToolByName(self, 'portal_url')
plonesite = urltool.getPortalObject()
## We disable the 'walk' operation because if the acl_users object is deep inside
## the Plone site, that is a real problem. Furthermore, that may be because
## we're already digging an GRUF and have the risk to update a GRUF/User/acl_users
## object !
## walk(out, plonesite, migrate_user_folder)
for obj in plonesite.objectValues():
migrate_user_folder(obj, out, )
print >>out, " Done Migrating UserFolders to GroupUserFolders."
return out.getvalue()
def install(self):
out = StringIO()
print >>out, "Installing GroupUserFolder"
install_subskin(self, out)
install_plone(self, out)
migrate_plone_site_to_gruf(self, out)
print >>out, "Done."
return out.getvalue()
|