loops/external/external.py
helmutm 86d7781725 added node export/import to external package; deprecate old node export/import
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2436 fd906abe-77d9-0310-91a1-e0d9ade77398
2008-03-05 17:22:34 +00:00

159 lines
4.3 KiB
Python

#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Adapter implementations for export, import, ...
Obsolete, replaced by functionality in loops.external.base and other modules
$Id$
"""
from zope.interface import implements, Interface
from zope.app import zapi
from zope.component import adapts
from loops.interfaces import IViewManager
from loops.view import Node
# import/export interfaces (for adapters)
class IExternalContentSource(Interface):
""" Provides content from an external source.
"""
def getData():
""" Retrieve content from the external source; return a sequence of
dictionaries in a format like this:
[{'name': ..., 'title': ..., 'body':... }, ...],
"""
class ILoader(Interface):
""" Inserts data provided by an IExternalContentSource object into the
database.
"""
def load(data):
""" Create objects as defined by the data given; this is a sequence
as described for IExternalContentSource.getContent().
"""
class IExporter(Interface):
""" Extracts data and in a format usable by ILoader.
Optionally dump data to a file.
"""
def extractData():
""" Return a data object as described for
IExternalContentSource.getData().
"""
def dumpData(file):
""" Dump data returned by extractData() to the file given in a
format that might be read in by a suitable implementation of
IExternalContentSource.
"""
# implementations for views/nodes
class NodesLoader(object):
implements(ILoader)
adapts(IViewManager)
def __init__(self, context):
self.context = context
def load(self, data):
for item in data:
name = item['name']
path = item['path']
parent = zapi.traverse(self.context, path)
if name in parent: # replace existing objects
del parent[name]
node = Node()
node.title = item['title']
node.description = item['description']
node.body = item['body']
node.nodeType = item['nodeType']
parent[name] = node
class NodesExporter(object):
implements(IExporter)
adapts(IViewManager)
filename = 'loops.dmp'
def __init__(self, context):
self.context = context
def extractData(self):
data = []
for child in self.context.values():
self.extractNodeData(child, '', data)
return data
def extractNodeData(self, item, path, data):
name = zapi.getName(item)
data.append({
'name': name,
'path': path,
'description': item.description,
'title': item.title,
'body': item.body,
'nodeType': item.nodeType
})
path = path and '%s/%s' % (path, name) or name
for child in item.values():
self.extractNodeData(child, path, data)
def dumpData(self, file=None, noclose=False):
if file is None:
file = open(self.filename, 'w')
data = self.extractData()
text = `data`.replace('},', '},\n').replace('}],', '}],\n')
file.write(text)
if not noclose:
file.close()
class NodesImporter(object):
implements(IExternalContentSource)
adapts(IViewManager)
filename = 'loops.dmp'
def __init__(self, context):
self.context = context
def getData(self, file=None):
if file is None:
file = open(self.filename, 'r')
data = file.read().replace('\n', '')
file.close()
return eval(data, {}, {})