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
This commit is contained in:
helmutm 2008-03-05 17:22:34 +00:00
parent 255d47f5da
commit 86d7781725
8 changed files with 100 additions and 62 deletions

View file

@ -837,52 +837,11 @@ informations about all parents of an object.
Import/Export
=============
Nodes may be exported to and loaded from external sources, typically
file representations that allow the transfer of nodes from one Zope
instance to another.
>>> from loops.external import NodesLoader
>>> loader = NodesLoader(views)
>>> data = [{'name': 'm2', 'path': '', 'description': u'desc 1',
... 'title': u'M 2', 'body': u'test m2', 'nodeType': 'menu' },
... {'name': 'm21', 'path': 'm2', 'description': u'',
... 'title': u'M 21', 'body': u'test m21', 'nodeType': 'page' },
... {'name': 'm114', 'path': 'm1/m11', 'description': u'',
... 'title': u'M 114', 'body': u'test m114', 'nodeType': 'page' },]
>>> loader.load(data)
>>> views['m2']['m21'].title
u'M 21'
>>> views['m1']['m11']['m114'].title
u'M 114'
>>> from loops.external import NodesExporter, NodesImporter
>>> exporter = NodesExporter(views)
>>> data = exporter.extractData()
>>> len(data)
8
>>> data[3]['path']
u'm1/m11'
>>> data[3]['name']
u'm112'
>>> dumpname = os.path.dirname(__file__) + '/test.tmp'
>>> exporter.filename = dumpname
>>> exporter.dumpData()
Load them again from the exported file:
>>> importer = NodesImporter(views)
>>> importer.filename = dumpname
>>> imported = importer.getData()
>>> imported == data
True
>>> loader.load(imported)
Obsolete - see package loops.external.
Fin de partie
=============
>>> os.unlink(dumpname)
>>> placefulTearDown()

View file

@ -391,20 +391,16 @@
menu="zmi_views" title="Contents"
/>
<!-- import/export -->
<!-- import/export - obsolete:
<pages for="loops.interfaces.IViewManager"
class=".external.NodesExportImport"
permission="zope.ManageContent">
<page name="exportimport.html"
template="exportimport.pt"
menu="zmi_views" title="Export/Import" />
<page name="export_nodes.html"
attribute="export" />
</pages>
</pages>-->
<!-- node -->

View file

@ -325,9 +325,11 @@
<adapter factory="loops.schema.NoteSchemaFactory" />
<adapter factory="loops.setup.SetupManager" />
<!-- obsolete:
<adapter factory="loops.external.NodesLoader" />
<adapter factory="loops.external.NodesExporter" />
<adapter factory="loops.external.NodesImporter" />
<adapter factory="loops.external.NodesImporter" />-->
<adapter factory="loops.target.DocumentProxy"
permission="zope.ManageContent" />

16
external/README.txt vendored
View file

@ -48,6 +48,16 @@ Creating the corresponding objects
>>> adapted(concepts['myquery']).viewName
'mystuff.html'
Working with nodes
------------------
>>> input = ("node('home', u'Home', '', u'menu', body=u'Welcome')\n"
... "node('myquery', u'My Query', 'home', u'page', "
... " target='concepts/myquery')")
>>> reader = PyReader()
>>> elements = reader.read(input)
>>> loader.load(elements)
Exporting loops Objects
=======================
@ -60,7 +70,7 @@ Extracting elements
>>> extractor = Extractor(loopsRoot)
>>> elements = list(extractor.extract())
>>> len(elements)
13
15
Writing object information to the external storage
--------------------------------------------------
@ -76,7 +86,9 @@ Writing object information to the external storage
type(u'query', u'Query', options=u'', typeInterface='loops.query.IQueryConcept',
viewName=u'')...
concept(u'myquery', u'My Query', u'query', options=u'', viewName='mystuff.html')...
child(u'projects', u'customer', u'standard')...
child(u'projects', u'customer', u'standard')
node('home', u'Home', '', u'menu', body=u'Welcome')
node('myquery', u'My Query', 'home', u'page', target=u'concepts/myquery')...
The Export/Import View

View file

@ -2,4 +2,4 @@
$Id$
"""
from loops.external.external import NodesLoader, NodesExporter, NodesImporter
#from loops.external.external import NodesLoader, NodesExporter, NodesImporter

31
external/base.py vendored
View file

@ -28,7 +28,7 @@ import itertools
from zope import component
from zope.cachedescriptors.property import Lazy
from zope.interface import implements
from zope.traversing.api import getName
from zope.traversing.api import getName, getParent
from cybertools.composer.interfaces import IInstance
from cybertools.composer.schema.interfaces import ISchemaFactory
@ -49,6 +49,14 @@ class Base(object):
def concepts(self):
return self.context.getConceptManager()
@Lazy
def resources(self):
return self.context.getResourceManager()
@Lazy
def views(self):
return self.context.getViewManager()
@Lazy
def typeConcept(self):
return self.concepts.getTypeConcept()
@ -84,8 +92,7 @@ class Extractor(Base):
self.extractChildren(),
#self.extractResources(),
#self.extractResourceRelations(),
#self.extractNodes(),
#self.extractTargets(),
self.extractNodes(),
)
def extractTypes(self):
@ -141,3 +148,21 @@ class Extractor(Base):
args.append(r.relevance)
yield childElement(*args)
def extractNodes(self, parent=None, path=''):
if parent is None:
parent = self.views
element = elementTypes['node']
for name, obj in parent.items():
data = {}
for attr in ('description', 'body', 'viewName'):
value = getattr(obj, attr)
if value:
data[attr] = value
target = obj.target
if target is not None:
data['target'] = '/'.join((getName(getParent(target)), getName(target)))
yield element(name, obj.title, path, obj.nodeType, **data)
childPath = path and '/'.join((path, name)) or name
for elem in self.extractNodes(obj, childPath):
yield elem

56
external/element.py vendored
View file

@ -26,7 +26,7 @@ $Id$
from zope.cachedescriptors.property import Lazy
from zope.dottedname.resolve import resolve
from zope.interface import implements
from zope.traversing.api import getName
from zope.traversing.api import getName, traverse
from loops.external.interfaces import IElement
@ -57,7 +57,7 @@ class ConceptElement(Element):
def __call__(self, loader):
type = loader.concepts[self['type']]
kw = dict((k, v) for k, v in self.items()
if k not in ('name', 'title', 'type'))
if k not in self.posArgs)
loader.addConcept(self['name'], self['title'], type, **kw)
@ -81,11 +81,6 @@ class TypeElement(ConceptElement):
loader.addConcept(self['name'], self['title'], 'type', **kw)
class ResourceElement(ConceptElement):
elementType = 'resource'
class ChildElement(Element):
elementType = 'child'
@ -99,9 +94,56 @@ class ChildElement(Element):
loader.assignChild(self['first'], self['second'], self['predicate'])
class NodeElement(Element):
elementType = 'node'
posArgs = ('name', 'title', 'path', 'type')
def __init__(self, *args, **kw):
for idx, arg in enumerate(args):
self[self.posArgs[idx]] = arg
for k, v in kw.items():
self[k] = v
def __call__(self, loader):
type = self['type']
cont = traverse(loader.views, self['path'])
target = self.pop('target', None)
kw = dict((k, v) for k, v in self.items()
if k not in self.posArgs)
node = loader.addNode(self['name'], self['title'], cont, type, **kw)
if target is not None:
node.target = traverse(loader.context, target)
# not yet implemented
class ResourceElement(Element):
elementType = 'resource'
posArgs = ('name', 'title', 'type')
def __call__(self, loader):
type = loader.concepts[self['type']]
kw = dict((k, v) for k, v in self.items()
if k not in self.posArgs)
loader.addResource(self['name'], self['title'], type, **kw)
class ResourceRelationElement(ChildElement):
elementType = 'resourceRelation'
def __call__(self, loader):
loader.assignResource(self['first'], self['second'], self['predicate'])
# element registry
elementTypes = dict(
type=TypeElement,
concept=ConceptElement,
resource=ResourceElement,
child=ChildElement,
node=NodeElement,
)

View file

@ -19,6 +19,8 @@
"""
Adapter implementations for export, import, ...
Obsolete, replaced by functionality in loops.external.base and other modules
$Id$
"""