1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
"""Plone Properties tool setup handlers.
$Id:$
"""
from zope.app import zapi
from Products.CMFCore.utils import getToolByName
from Products.GenericSetup.interfaces import IBody
from Products.GenericSetup.interfaces import INode
from Products.GenericSetup.utils import XMLAdapterBase
from Products.GenericSetup.utils import ObjectManagerHelpers
from Products.GenericSetup.utils import PropertyManagerHelpers
from Products.GenericSetup.utils import I18NURI
from Products.CMFPlone.PropertiesTool import SimpleItemWithProperties
from Products.CMFPlone.interfaces import IPropertiesTool, ISimpleItemWithProperties
_FILENAME = 'propertiestool.xml'
def importPloneProperties(context):
""" Import plone properties tool.
"""
site = context.getSite()
logger = context.getLogger('propertiestool')
ptool = getToolByName(site, 'portal_properties')
body = context.readDataFile(_FILENAME)
if body is None:
logger.info('Nothing to import.')
return
importer = zapi.queryMultiAdapter((ptool, context), IBody)
if importer is None:
logger.warning('Import adapter missing.')
return
importer.body = body
logger.info('Properties tool imported.')
def exportPloneProperties(context):
""" Export plone properties tool.
"""
site = context.getSite()
logger = context.getLogger('propertiestool')
ptool = getToolByName(site, 'portal_properties', None)
if ptool is None:
logger.info('Nothing to export.')
return
exporter = zapi.queryMultiAdapter((ptool, context), IBody)
#IBody(ptool)
if exporter is None:
logger.warning('Export adapter missing.')
return
context.writeDataFile(_FILENAME, exporter.body, exporter.mime_type)
logger.info('Properties tool exported.')
class SimpleItemWithPropertiesXMLAdapter(XMLAdapterBase, PropertyManagerHelpers):
"""Node im- and exporter for SimpleItemWithProperties.
"""
__used_for__ = ISimpleItemWithProperties
def _exportNode(self):
"""Export the object as a DOM node.
"""
#self._doc = doc
node = self._getObjectNode('object')
node.appendChild(self._extractProperties())
return node
def _importNode(self, node):
"""Import the object from the DOM node.
"""
self._initProperties(node)
node = property(_exportNode, _importNode)
class PlonePropertiesToolXMLAdapter(XMLAdapterBase, ObjectManagerHelpers):
"""Node im- and exporter for Plone PropertiesTool.
"""
__used_for__ = IPropertiesTool
def _exportNode(self):
"""Export the object as a DOM node.
"""
#self._doc = doc
node = self._getObjectNode('object')
#node.setAttribute('xmlns:i18n', I18NURI)
node.appendChild(self._extractObjects())
return node
def _importNode(self, node):
"""Import the object from the DOM node.
"""
if self.environ.shouldPurge():
self._purgeObjects()
self._initObjects(node)
def _initObjects(self, node):
"""Import subobjects"""
## XXX: We could just use the _initObjects() from
## ObjectManagerHelpers except that it looks up the object
## constructor from Products.meta_type and
## SimpleItemWithProperties doesn't get registered there.
for child in node.childNodes:
if child.nodeName != 'object':
continue
if child.hasAttribute('deprecated'):
continue
parent = self.context
obj_id = str(child.getAttribute('name'))
if obj_id not in parent.objectIds():
parent._setObject(obj_id, SimpleItemWithProperties(obj_id))
## Original _initObjects code:
## meta_type = str(child.getAttribute('meta_type'))
## for mt_info in Products.meta_types:
## if mt_info['name'] == meta_type:
## parent._setObject(obj_id, mt_info['instance'](obj_id))
## break
## else:
## raise ValueError('unknown meta_type \'%s\'' % obj_id)
if child.hasAttribute('insert-before'):
insert_before = child.getAttribute('insert-before')
if insert_before == '*':
parent.moveObjectsToTop(obj_id)
else:
try:
position = parent.getObjectPosition(insert_before)
parent.moveObjectToPosition(obj_id, position)
except ValueError:
pass
elif child.hasAttribute('insert-after'):
insert_after = child.getAttribute('insert-after')
if insert_after == '*':
parent.moveObjectsToBottom(obj_id)
else:
try:
position = parent.getObjectPosition(insert_after)
parent.moveObjectToPosition(obj_id, position+1)
except ValueError:
pass
obj = getattr(self.context, obj_id)
importer = zapi.queryMultiAdapter((obj, self.environ), INode)
if importer:
importer.node = child
|