JSON (JavaScript Object Notation) ist gut geeignet um die Inhalte aus Plone im- und exportieren zu können. collective.jsonmigrator kann ggf. diese Azfgabe erleichtern.
Alternativ lässt sich auch einfach ein eigener View schreiben zum Export im JSON-Format:
import os
import base64
try:
import json
except ImportError:
# Python 2.5/Plone 3.3 use simplejson
import simplejson as json
from Products.Five.browser import BrowserView
from Products.CMFCore.interfaces import IFolderish
from DateTime import DateTime
# Private attributes for the export list
EXPORT_ATTRIBUTES = ["portal_type", "id"]
class ExportFolderAsJSON(BrowserView):
"""
Exports the current context folder as JSON.
"""
def convert(self, value):
"""
Convert value to more JSON friendly format.
"""
if isinstance(value, DateTime):
# Zope DateTime
return value.ISO8601()
elif hasattr(value, "isBinary") and value.isBinary():
return None
# FileField and ImageField payloads are binary
# as OFS.Image.File object
data = getattr(value.data, "data", None)
if not data:
return None
return base64.b64encode(data)
else:
return value
def grabData(self, obj):
"""
Export schema data as dictionary object.
Binary fields are encoded as BASE64.
"""
data = {}
for field in obj.Schema().fields():
name = field.getName()
value = field.getRaw(obj)
print "%s" % (value.__class__)
data[name] = self.convert(value)
return data
def grabAttributes(self, obj):
data = {}
for key in EXPORT_ATTRIBUTES:
data[key] = self.convert(getattr(obj, key, None))
return data
def export(self, folder, recursive=False):
"""
Export content items.
Possible to do recursively nesting into the children.
:return: list of dictionaries
"""
array = []
for obj in folder.listFolderContents():
data = self.grabData(obj)
data.update(self.grabAttributes(obj))
if recursive:
if IFolderish.providedBy(obj):
data["children"] = self.export(obj, True)
array.append(data)
return array
def __call__(self):
"""
"""
folder = self.context.aq_inner
data = self.export(folder)
pretty = json.dumps(data, sort_keys=True, indent=' ')
self.request.response.setHeader("Content-type", "application/json")
return pretty