From 87728d9b4278a10b35c89d7ca114e9b0b60550dd Mon Sep 17 00:00:00 2001
From: =?utf8?q?Beno=C3=AEt=20Pin?= <benoit.pin@gmail.com>
Date: Thu, 19 Dec 2013 14:21:51 +0100
Subject: [PATCH] Ajout script de migration zctl dossier standard vers btree.

---
 _zctl/folders2BTrees.py | 39 +++++++++++++++++++++++++++++++++++++++
 migration/__init__.py   |  1 +
 migration/folder.py     | 25 +++++++++++++++++++++++++
 3 files changed, 65 insertions(+)
 create mode 100644 _zctl/folders2BTrees.py
 create mode 100644 migration/__init__.py
 create mode 100644 migration/folder.py

diff --git a/_zctl/folders2BTrees.py b/_zctl/folders2BTrees.py
new file mode 100644
index 0000000..a7b8a4a
--- /dev/null
+++ b/_zctl/folders2BTrees.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+from argparse import ArgumentParser
+import os.path
+from Acquisition import aq_base
+from zope.site.hooks import setSite
+from Products.CMFCore.CMFCatalogAware import CMFCatalogAware
+import transaction
+from OFS.interfaces import IObjectManager
+from zope.interface import providedBy
+from Products.Plinn.Folder import PlinnFolder
+from Products.Plinn.HugePlinnFolder import HugePlinnFolder
+from Products.Plinn.migration.folder import migrateFolder
+
+def recurseMigrateFolders(parent) :
+    for child in parent.objectValues() :
+        if IObjectManager.providedBy(child) :
+            recurseMigrateFolders(child)
+            if isinstance(child, PlinnFolder) and \
+               not isinstance(child, HugePlinnFolder) :
+                migrated = migrateFolder(child, parent)
+                # pseudo _finishContrsuction to preserve dates.
+                migrated._setPortalTypeName('Huge Plinn Folder')
+                migrated.reindexObject()
+                
+
+
+
+
+parser = ArgumentParser(description="Convert all regular Plinn Folder to Huge Plinn Folder")
+parser.add_argument('portal_path')
+parser.add_argument('--dry-run', action='store_true')
+args = parser.parse_args()
+portal = app.unrestrictedTraverse(args.portal_path)
+setSite(portal)
+
+recurseMigrateFolders(portal)
+
+if not args.dry_run :
+    transaction.commit()
\ No newline at end of file
diff --git a/migration/__init__.py b/migration/__init__.py
new file mode 100644
index 0000000..4287ca8
--- /dev/null
+++ b/migration/__init__.py
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/migration/folder.py b/migration/folder.py
new file mode 100644
index 0000000..55cd462
--- /dev/null
+++ b/migration/folder.py
@@ -0,0 +1,25 @@
+from Products.Plinn.HugePlinnFolder import HugePlinnFolder
+
+IGNORED_ATTRIBUTES = ('_objects',)
+
+def migrateFolder(old, container) :
+    print 'migrate %s' % old.absolute_url()
+
+    origid = old.getId()
+    title = old.Title()
+    toBeSkipped = IGNORED_ATTRIBUTES + tuple(old.objectIds())
+
+    new = HugePlinnFolder(origid, title=title)
+
+    for name in old.__dict__.keys() :
+        if name in toBeSkipped :
+            continue
+        else :
+            setattr(new, name, getattr(old, name))
+        
+    new._populateFromFolder(old)
+
+    container._delOb(origid)
+    container._setOb(origid, new)
+
+    return container._getOb(origid)
-- 
2.20.1