Commit a42fdc6e authored by Julien Muchembled's avatar Julien Muchembled

If possible, do not migrate XML to <global name="..." module="erp5.portal_type"/>

This preserves forward compatibility for some BT that are still developped with
instances not using portal types as classes.

Also remove TemplateTool_filterPortalTypeClassDiff, which is unreliable
(because it may break legitime migration of XML) and now useless.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@40073 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent e004cec6
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Python Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
if len(old_line_list) !=1 or len(new_line_list) != 1:\n
return False\n
new_line = new_line_list[0]\n
\n
new_group_list = new_line.split(\'"\')\n
if len(new_group_list) != 5:\n
return False\n
\n
before, portal_type, module, erp5_portal_type, after = new_group_list\n
if before != \'<global name=\' or module != \' module=\' or erp5_portal_type != \'erp5.portal_type\' or after != \'/>\':\n
return False\n
\n
old_group_list = old_line_list[0].split(\'"\')\n
if len(old_group_list) == 5:\n
before2, ignore, module2, products_erp5type, after2 = old_group_list\n
return before2 == before and module2 == module and products_erp5type.startswith("Products.ERP5Type.Document.") and after2 == after\n
return False\n
]]></string> </value>
</item>
<item>
<key> <string>_code</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>old_line_list, new_line_list</string> </value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>callable_type/script/diff_filter</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string encoding="cdata"><![CDATA[
This script filter this kind of xml changes :\n
- <global name="BaseCategory" module="Products.ERP5Type.Document.BaseCategory"/>\n
+ <global name="Base Category" module="erp5.portal_type"/>
]]></string> </value>
</item>
<item>
<key> <string>errors</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>func_code</string> </key>
<value>
<object>
<klass>
<global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>co_argcount</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>co_varnames</string> </key>
<value>
<tuple>
<string>old_line_list</string>
<string>new_line_list</string>
<string>len</string>
<string>False</string>
<string>_getitem_</string>
<string>new_line</string>
<string>_getattr_</string>
<string>new_group_list</string>
<string>_getiter_</string>
<string>before</string>
<string>portal_type</string>
<string>module</string>
<string>erp5_portal_type</string>
<string>after</string>
<string>old_group_list</string>
<string>before2</string>
<string>ignore</string>
<string>module2</string>
<string>products_erp5type</string>
<string>after2</string>
</tuple>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>func_defaults</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>TemplateTool_filterPortalTypeClassDiff</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Python Script</string> </value>
</item>
<item>
<key> <string>warnings</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
1780 1781
\ No newline at end of file \ No newline at end of file
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
# Make sure the xml export will be ordered # Make sure the xml export will be ordered
import re import re, sys
from ZODB.utils import u64, p64 from ZODB.utils import u64, p64
from Shared.DC.xml import ppml from Shared.DC.xml import ppml
from base64 import encodestring from base64 import encodestring
...@@ -105,6 +105,20 @@ def cleanup_ZopePageTemplate(state): ...@@ -105,6 +105,20 @@ def cleanup_ZopePageTemplate(state):
def cleanupState(classdef, state): def cleanupState(classdef, state):
classdef = getCleanClass(classdef) classdef = getCleanClass(classdef)
# if possible, unmigrate document using portal_type as classes
# (in order to preserve forward compatibility)
if getattr(classdef, '__module__', None) == 'erp5.portal_type' and \
len(classdef.__bases__) == 1:
base, = classdef.__bases__
portal_type = isinstance(state, dict) and state.get('portal_type') or \
getattr(base, 'portal_type', None)
if portal_type == classdef.__name__:
class_name = base.__name__
try:
module = sys.modules['Products.ERP5Type.Document.' + class_name]
classdef = getattr(module, class_name)
except KeyError:
classdef = base
cleanupState = PICKLE_CLEANERS.get(classdef, lambda state: None) cleanupState = PICKLE_CLEANERS.get(classdef, lambda state: None)
cleanupState(state) cleanupState(state)
return classdef, state return classdef, state
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment