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 Import/Export
============= =============
Nodes may be exported to and loaded from external sources, typically Obsolete - see package loops.external.
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)
Fin de partie Fin de partie
============= =============
>>> os.unlink(dumpname)
>>> placefulTearDown() >>> placefulTearDown()

View file

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

View file

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

16
external/README.txt vendored
View file

@ -48,6 +48,16 @@ Creating the corresponding objects
>>> adapted(concepts['myquery']).viewName >>> adapted(concepts['myquery']).viewName
'mystuff.html' '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 Exporting loops Objects
======================= =======================
@ -60,7 +70,7 @@ Extracting elements
>>> extractor = Extractor(loopsRoot) >>> extractor = Extractor(loopsRoot)
>>> elements = list(extractor.extract()) >>> elements = list(extractor.extract())
>>> len(elements) >>> len(elements)
13 15
Writing object information to the external storage 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', type(u'query', u'Query', options=u'', typeInterface='loops.query.IQueryConcept',
viewName=u'')... viewName=u'')...
concept(u'myquery', u'My Query', u'query', options=u'', viewName='mystuff.html')... 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 The Export/Import View

View file

@ -2,4 +2,4 @@
$Id$ $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 import component
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.interface import implements 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.interfaces import IInstance
from cybertools.composer.schema.interfaces import ISchemaFactory from cybertools.composer.schema.interfaces import ISchemaFactory
@ -49,6 +49,14 @@ class Base(object):
def concepts(self): def concepts(self):
return self.context.getConceptManager() return self.context.getConceptManager()
@Lazy
def resources(self):
return self.context.getResourceManager()
@Lazy
def views(self):
return self.context.getViewManager()
@Lazy @Lazy
def typeConcept(self): def typeConcept(self):
return self.concepts.getTypeConcept() return self.concepts.getTypeConcept()
@ -84,8 +92,7 @@ class Extractor(Base):
self.extractChildren(), self.extractChildren(),
#self.extractResources(), #self.extractResources(),
#self.extractResourceRelations(), #self.extractResourceRelations(),
#self.extractNodes(), self.extractNodes(),
#self.extractTargets(),
) )
def extractTypes(self): def extractTypes(self):
@ -141,3 +148,21 @@ class Extractor(Base):
args.append(r.relevance) args.append(r.relevance)
yield childElement(*args) 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.cachedescriptors.property import Lazy
from zope.dottedname.resolve import resolve from zope.dottedname.resolve import resolve
from zope.interface import implements from zope.interface import implements
from zope.traversing.api import getName from zope.traversing.api import getName, traverse
from loops.external.interfaces import IElement from loops.external.interfaces import IElement
@ -57,7 +57,7 @@ class ConceptElement(Element):
def __call__(self, loader): def __call__(self, loader):
type = loader.concepts[self['type']] type = loader.concepts[self['type']]
kw = dict((k, v) for k, v in self.items() 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) loader.addConcept(self['name'], self['title'], type, **kw)
@ -81,11 +81,6 @@ class TypeElement(ConceptElement):
loader.addConcept(self['name'], self['title'], 'type', **kw) loader.addConcept(self['name'], self['title'], 'type', **kw)
class ResourceElement(ConceptElement):
elementType = 'resource'
class ChildElement(Element): class ChildElement(Element):
elementType = 'child' elementType = 'child'
@ -99,9 +94,56 @@ class ChildElement(Element):
loader.assignChild(self['first'], self['second'], self['predicate']) 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( elementTypes = dict(
type=TypeElement, type=TypeElement,
concept=ConceptElement, concept=ConceptElement,
resource=ResourceElement, resource=ResourceElement,
child=ChildElement, child=ChildElement,
node=NodeElement,
) )

View file

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