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:
parent
255d47f5da
commit
86d7781725
8 changed files with 100 additions and 62 deletions
43
README.txt
43
README.txt
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
||||||
|
|
|
@ -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
16
external/README.txt
vendored
|
@ -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
|
||||||
|
|
2
external/__init__.py
vendored
2
external/__init__.py
vendored
|
@ -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
31
external/base.py
vendored
|
@ -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
56
external/element.py
vendored
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
2
external/external.py
vendored
2
external/external.py
vendored
|
@ -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$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue