eggification
[GroupUserFolder.git] / Products / GroupUserFolder / Extensions / Install.py
diff --git a/Products/GroupUserFolder/Extensions/Install.py b/Products/GroupUserFolder/Extensions/Install.py
new file mode 100644 (file)
index 0000000..87de596
--- /dev/null
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+## GroupUserFolder
+## Copyright (C)2006 Ingeniweb
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; see the file COPYING. If not, write to the
+## Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+"""
+
+"""
+__version__ = "$Revision:  $"
+# $Source:  $
+# $Id: Install.py 30098 2006-09-08 12:35:01Z encolpe $
+__docformat__ = 'restructuredtext'
+
+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()