[Erp5-report] r39225 leonardo - /erp5/trunk/products/ERP5Type/patches/XMLExportImport.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Oct 15 13:33:18 CEST 2010
Author: leonardo
Date: Fri Oct 15 13:33:16 2010
New Revision: 39225
URL: http://svn.erp5.org?rev=39225&view=rev
Log:
Better infrastructure for writing state cleaners for pickles. Includes the cleaner for ZPTs, making them look like their Zope 2.12 counterpart
Modified:
erp5/trunk/products/ERP5Type/patches/XMLExportImport.py
Modified: erp5/trunk/products/ERP5Type/patches/XMLExportImport.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/patches/XMLExportImport.py?rev=39225&r1=39224&r2=39225&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/patches/XMLExportImport.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/patches/XMLExportImport.py [utf8] Fri Oct 15 13:33:16 2010
@@ -70,20 +70,48 @@ from ExtensionClass import Base
Base__getnewargs__ = getattr(Base, '__getnewargs__', None)
if Base__getnewargs__ is None:
is_old_btree = lambda pickle: None
- def maybeSimplifyClass(klass):
- return klass
+ def getCleanClass(classdef):
+ return classdef
else:
is_old_btree = re.compile('cBTrees\\._(..)BTree\n(\\1)BTree\n').match
- def maybeSimplifyClass(klass):
- if isinstance(klass, tuple):
- pureclass, newargs = klass
+ def getCleanClass(classdef):
+ if isinstance(classdef, tuple):
+ pureclass, newargs = classdef
if (newargs == () and
not isinstance(pureclass, tuple) and
getattr(pureclass, '__getnewargs__', None) is Base__getnewargs__):
return pureclass
- return klass
+ return classdef
# END ExtensionClass.Base.__getnewargs__ XML simplification
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
+
+PICKLE_CLEANERS = {}
+
+class cleaner_for(object):
+
+ def __init__(self, classdef):
+ self.classdef = classdef
+
+ def __call__(self, callable):
+ PICKLE_CLEANERS[self.classdef] = callable
+ return callable
+
+# BBB: Remove this cleaner when we drop support for Zope 2.8
+ at cleaner_for(ZopePageTemplate)
+def cleanup_ZopePageTemplate(state):
+ if isinstance(state.get('_text'), str):
+ state['_text'] = unicode(state['_text'], 'utf-8')
+ state['output_encoding'] = 'utf-8'
+ if isinstance(state.get('title'), str):
+ state['title'] = unicode(state['title'], 'utf-8')
+
+def cleanupState(classdef, state):
+ classdef = getCleanClass(classdef)
+ cleanupState = PICKLE_CLEANERS.get(classdef, lambda state: None)
+ cleanupState(state)
+ return classdef, state
+
def reorderPickle(jar, p):
from ZODB.ExportImport import Ghost, Unpickler, Pickler, StringIO, persistent_id
@@ -119,10 +147,10 @@ def reorderPickle(jar, p):
pickler=OrderedPickler(newp,1)
pickler.persistent_id=persistent_id
- klass = unpickler.load()
- klass = maybeSimplifyClass(klass)
- pickler.dump(klass)
+ classdef = unpickler.load()
obj = unpickler.load()
+ classdef, obj = cleanupState(classdef, obj)
+ pickler.dump(classdef)
pickler.dump(obj)
p=newp.getvalue()
if is_old_btree(p):
More information about the Erp5-report
mailing list