Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Titouan Soulard
erp5
Commits
5b43a962
Commit
5b43a962
authored
Mar 17, 2023
by
Jérome Perrin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
XMLExportImport: WIP support pickle protocol 3
🚧
parent
1fd101de
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
268 additions
and
73 deletions
+268
-73
product/ERP5/Document/BusinessTemplate.py
product/ERP5/Document/BusinessTemplate.py
+8
-6
product/ERP5Type/XMLExportImport/__init__.py
product/ERP5Type/XMLExportImport/__init__.py
+24
-11
product/ERP5Type/XMLExportImport/ppml.py
product/ERP5Type/XMLExportImport/ppml.py
+236
-56
No files found.
product/ERP5/Document/BusinessTemplate.py
View file @
5b43a962
...
@@ -79,6 +79,7 @@ from OFS import SimpleItem
...
@@ -79,6 +79,7 @@ from OFS import SimpleItem
from
OFS.Image
import
Pdata
from
OFS.Image
import
Pdata
import
coverage
import
coverage
from
io
import
BytesIO
from
io
import
BytesIO
from
six.moves
import
StringIO
from
copy
import
deepcopy
from
copy
import
deepcopy
from
zExceptions
import
BadRequest
from
zExceptions
import
BadRequest
from
Products.ERP5Type.XMLExportImport
import
exportXML
,
customImporters
from
Products.ERP5Type.XMLExportImport
import
exportXML
,
customImporters
...
@@ -347,10 +348,11 @@ class BusinessTemplateArchive(object):
...
@@ -347,10 +348,11 @@ class BusinessTemplateArchive(object):
try
:
try
:
write
=
self
.
_writeFile
write
=
self
.
_writeFile
except
AttributeError
:
except
AttributeError
:
if
not
isinstance
(
obj
,
(
bytes
,
str
)
):
if
hasattr
(
obj
,
'read'
):
obj
.
seek
(
0
)
obj
.
seek
(
0
)
obj
=
obj
.
read
()
obj
=
obj
.
read
()
elif
not
isinstance
(
obj
,
bytes
):
#import pdb; pdb.set_trace()
if
not
isinstance
(
obj
,
bytes
):
obj
=
obj
.
encode
(
'utf-8'
)
obj
=
obj
.
encode
(
'utf-8'
)
self
.
revision
.
hash
(
path
,
obj
)
self
.
revision
.
hash
(
path
,
obj
)
self
.
_writeString
(
obj
,
path
)
self
.
_writeString
(
obj
,
path
)
...
@@ -865,9 +867,9 @@ class ObjectTemplateItem(BaseTemplateItem):
...
@@ -865,9 +867,9 @@ class ObjectTemplateItem(BaseTemplateItem):
obj
=
self
.
removeProperties
(
obj
,
1
,
keep_workflow_history
=
True
)
obj
=
self
.
removeProperties
(
obj
,
1
,
keep_workflow_history
=
True
)
transaction
.
savepoint
(
optimistic
=
True
)
transaction
.
savepoint
(
optimistic
=
True
)
f
=
Bytes
IO
()
f
=
String
IO
()
exportXML
(
obj
.
_p_jar
,
obj
.
_p_oid
,
f
)
exportXML
(
obj
.
_p_jar
,
obj
.
_p_oid
,
f
)
bta
.
addObject
(
f
,
key
,
path
=
path
)
bta
.
addObject
(
f
.
getvalue
().
encode
()
,
key
,
path
=
path
)
if
catalog_method_template_item
:
if
catalog_method_template_item
:
# add all datas specific to catalog inside one file
# add all datas specific to catalog inside one file
...
@@ -1083,8 +1085,8 @@ class ObjectTemplateItem(BaseTemplateItem):
...
@@ -1083,8 +1085,8 @@ class ObjectTemplateItem(BaseTemplateItem):
for
path
,
old_object
in
upgrade_list
:
for
path
,
old_object
in
upgrade_list
:
# compare object to see it there is changes
# compare object to see it there is changes
new_object
=
self
.
_objects
[
path
]
new_object
=
self
.
_objects
[
path
]
new_io
=
Bytes
IO
()
new_io
=
String
IO
()
old_io
=
Bytes
IO
()
old_io
=
String
IO
()
exportXML
(
new_object
.
_p_jar
,
new_object
.
_p_oid
,
new_io
)
exportXML
(
new_object
.
_p_jar
,
new_object
.
_p_oid
,
new_io
)
new_obj_xml
=
new_io
.
getvalue
()
new_obj_xml
=
new_io
.
getvalue
()
try
:
try
:
...
...
product/ERP5Type/XMLExportImport/__init__.py
View file @
5b43a962
...
@@ -48,7 +48,7 @@ from lxml import etree
...
@@ -48,7 +48,7 @@ from lxml import etree
from
lxml.etree
import
Element
,
SubElement
from
lxml.etree
import
Element
,
SubElement
from
xml_marshaller.xml_marshaller
import
Marshaller
from
xml_marshaller.xml_marshaller
import
Marshaller
from
OFS.Image
import
Pdata
from
OFS.Image
import
Pdata
from
base64
import
standard_b64encode
from
base64
import
standard_b64encode
,
encodebytes
from
hashlib
import
sha1
from
hashlib
import
sha1
from
Products.ERP5Type.Utils
import
ensure_list
from
Products.ERP5Type.Utils
import
ensure_list
#from zLOG import LOG
#from zLOG import LOG
...
@@ -223,7 +223,6 @@ def Folder_asXML(object, omit_xml_declaration=True, root=None):
...
@@ -223,7 +223,6 @@ def Folder_asXML(object, omit_xml_declaration=True, root=None):
## The code below was initially from OFS.XMLExportImport
## The code below was initially from OFS.XMLExportImport
from
six
import
string_types
as
basestring
from
six
import
string_types
as
basestring
from
base64
import
encodebytes
from
ZODB.serialize
import
referencesf
from
ZODB.serialize
import
referencesf
from
ZODB.ExportImport
import
TemporaryFile
,
export_end_marker
from
ZODB.ExportImport
import
TemporaryFile
,
export_end_marker
from
ZODB.utils
import
p64
from
ZODB.utils
import
p64
...
@@ -253,7 +252,6 @@ def reorderPickle(jar, p):
...
@@ -253,7 +252,6 @@ def reorderPickle(jar, p):
new_oid
=
storage
.
new_oid
):
new_oid
=
storage
.
new_oid
):
"Remap a persistent id to an existing ID and create a ghost for it."
"Remap a persistent id to an existing ID and create a ghost for it."
if
isinstance
(
ooid
,
tuple
):
ooid
,
klass
=
ooid
if
isinstance
(
ooid
,
tuple
):
ooid
,
klass
=
ooid
else
:
klass
=
None
else
:
klass
=
None
...
@@ -270,13 +268,23 @@ def reorderPickle(jar, p):
...
@@ -270,13 +268,23 @@ def reorderPickle(jar, p):
unpickler
.
persistent_load
=
persistent_load
unpickler
.
persistent_load
=
persistent_load
newp
=
BytesIO
()
newp
=
BytesIO
()
pickler
=
OrderedPickler
(
newp
,
1
)
pickler
=
OrderedPickler
(
newp
,
3
)
pickler
.
persistent_id
=
persistent_id
pickler
.
persistent_id
=
persistent_id
classdef
=
unpickler
.
load
()
classdef
=
unpickler
.
load
()
obj
=
unpickler
.
load
()
obj
=
unpickler
.
load
()
pickler
.
dump
(
classdef
)
pickler
.
dump
(
classdef
)
pickler
.
dump
(
obj
)
pickler
.
dump
(
obj
)
if
0
:
# debug
debugp
=
BytesIO
()
debugpickler
=
OrderedPickler
(
debugp
,
3
)
debugpickler
.
persistent_id
=
persistent_id
debugpickler
.
dump
(
obj
)
import
pickletools
print
(
debugp
.
getvalue
())
print
(
pickletools
.
dis
(
debugp
.
getvalue
()))
p
=
newp
.
getvalue
()
p
=
newp
.
getvalue
()
return
obj
,
p
return
obj
,
p
...
@@ -290,14 +298,13 @@ def _mapOid(id_mapping, oid):
...
@@ -290,14 +298,13 @@ def _mapOid(id_mapping, oid):
def
XMLrecord
(
oid
,
plen
,
p
,
id_mapping
):
def
XMLrecord
(
oid
,
plen
,
p
,
id_mapping
):
# Proceed as usual
# Proceed as usual
q
=
ppml
.
ToXMLUnpickler
f
=
BytesIO
(
p
)
f
=
BytesIO
(
p
)
u
=
ppml
.
ToXMLUnpickler
(
f
)
u
=
q
(
f
)
u
.
idprefix
,
id
,
aka
=
_mapOid
(
id_mapping
,
oid
)
u
.
idprefix
,
id
,
aka
=
_mapOid
(
id_mapping
,
oid
)
p
=
u
.
load
(
id_mapping
=
id_mapping
).
__str__
(
4
)
p
=
u
.
load
(
id_mapping
=
id_mapping
).
__str__
(
4
)
if
f
.
tell
()
<
plen
:
if
f
.
tell
()
<
plen
:
p
=
p
+
u
.
load
(
id_mapping
=
id_mapping
).
__str__
(
4
)
p
=
p
+
u
.
load
(
id_mapping
=
id_mapping
).
__str__
(
4
)
String
=
' <record id="%s" aka="%s">
\
n
%s </record>
\
n
'
%
(
id
,
aka
,
p
)
String
=
' <record id="%s" aka="%s">
\
n
%s </record>
\
n
'
%
(
id
,
aka
.
decode
()
,
p
)
return
String
return
String
def
exportXML
(
jar
,
oid
,
file
=
None
):
def
exportXML
(
jar
,
oid
,
file
=
None
):
...
@@ -334,15 +341,21 @@ def exportXML(jar, oid, file=None):
...
@@ -334,15 +341,21 @@ def exportXML(jar, oid, file=None):
# Do real export
# Do real export
if
file
is
None
:
if
file
is
None
:
file
=
TemporaryFile
()
file
=
TemporaryFile
(
mode
=
'w'
)
elif
isinstance
(
file
,
basestring
):
elif
isinstance
(
file
,
basestring
):
file
=
open
(
file
,
'w
+b
'
)
file
=
open
(
file
,
'w'
)
write
=
file
.
write
write
=
file
.
write
write
(
'<?xml version="1.0"?>
\
n
<ZopeData>
\
n
'
)
write
(
'<?xml version="1.0"?>
\
n
<ZopeData>
\
n
'
)
for
oid
in
reordered_oid_list
:
for
oid
in
reordered_oid_list
:
p
=
getReorderedPickle
(
oid
)
p
=
getReorderedPickle
(
oid
)
write
(
XMLrecord
(
oid
,
len
(
p
),
p
,
id_mapping
))
write
(
XMLrecord
(
oid
,
len
(
p
),
p
,
id_mapping
))
write
(
'</ZopeData>
\
n
'
)
write
(
'</ZopeData>
\
n
'
)
if
0
:
try
:
print
(
file
.
getvalue
())
except
AttributeError
:
pass
import
pdb
;
pdb
.
set_trace
()
return
file
return
file
class
zopedata
:
class
zopedata
:
...
...
product/ERP5Type/XMLExportImport/ppml.py
View file @
5b43a962
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment