From 57f2aa94f2faa4f3c511a96415afdc3a4cd32bba Mon Sep 17 00:00:00 2001 From: helmutm Date: Tue, 13 Apr 2010 09:20:00 +0000 Subject: [PATCH] provide export for selected nodes with target objects git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3814 fd906abe-77d9-0310-91a1-e0d9ade77398 --- external/base.py | 34 ++++++++++++++++++++++++++++------ external/browser.py | 13 +++++++++++-- external/exportimport.pt | 27 +++++++++++++++++++++------ 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/external/base.py b/external/base.py index bc5d557..3fa71a8 100644 --- a/external/base.py +++ b/external/base.py @@ -137,10 +137,25 @@ class Extractor(Base): self.count += 1 yield r - def extractNodes(self, parent=None, path=''): - if parent is None: - parent = self.views - for name, obj in parent.items(): + def getNodePath(self, node): + result = [] + node = getParent(node) + while node != self.views: + result.append(getName(node)) + node = getParent(node) + return '/'.join(reversed(result)) + + def extractNodes(self, parent=None, path='', + topNodes=[], includeTargets=False): + if topNodes: + startingSet = [(getName(n), n) for n in topNodes] + elif parent is None: + startingSet = self.views.items() + else: + startingSet = parent.items() + for name, obj in startingSet: + if topNodes: + path = self.getNodePath(obj) data = {} for attr in ('description', 'body', 'viewName', 'pageName'): value = getattr(obj, attr, None) @@ -148,7 +163,13 @@ class Extractor(Base): data[attr] = value target = obj.target if target is not None: - data['target'] = '/'.join((getName(getParent(target)), getName(target))) + tname = getName(target) + if includeTargets: + if IResource.providedBy(target): + yield self.getResourceElement(tname, target) + else: + yield self.getConceptElement(tname, target) + data['target'] = '/'.join((getName(getParent(target)), tname)) elementClass = (isinstance(obj, LayoutNode) and elementTypes['layoutNode'] or elementTypes['node']) elem = elementClass(name, obj.title, path, obj.nodeType, **data) @@ -156,7 +177,8 @@ class Extractor(Base): self.count += 1 yield elem childPath = path and '/'.join((path, name)) or name - for elem in self.extractNodes(obj, childPath): + for elem in self.extractNodes(obj, childPath, + includeTargets=includeTargets): #self.provideSubElements(obj, elem) self.count += 1 yield elem diff --git a/external/browser.py b/external/browser.py index 8d8e17f..00ace6e 100644 --- a/external/browser.py +++ b/external/browser.py @@ -31,7 +31,7 @@ from zope.app import zapi from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy from zope.security.proxy import removeSecurityProxy -from zope.traversing.api import getName, getPath +from zope.traversing.api import getName, getPath, traverse from cybertools.util.date import str2timeStamp from loops.external.base import Loader, Extractor @@ -74,7 +74,12 @@ class ExportImport(object): def export(self): form = self.request.form - parents = predicates = types = None + nodes = parents = predicates = types = None + nodePaths = form.get('nodes') + if nodePaths: + nodePaths = [p for p in nodePaths.splitlines() if p] + nodes = [traverse(self.context.getViewManager(), p) for p in nodePaths] + nodes = [p for p in nodes if p is not None] parentIds = form.get('parents') if parentIds: parentIds = [id for id in parentIds.splitlines() if id] @@ -87,6 +92,7 @@ class ExportImport(object): if typeIds: types = ([self.conceptManager[id] for id in typeIds]) changed = form.get('changed') + includeNodeTargets = form.get('include_node_targets') includeSubconcepts = form.get('include_subconcepts') includeResources = form.get('include_resources') extractor = Extractor(self.context, self.resourceExportDirectory) @@ -95,6 +101,9 @@ class ExportImport(object): if changed: elements = extractor.extractChanges(changed, parents, predicates, types) + elif nodes: + elements = extractor.extractNodes(topNodes=nodes, + includeTargets=includeNodeTargets) elif parents: elements = extractor.extractForParents(parents, predicates, types, includeSubconcepts, includeResources) diff --git a/external/exportimport.pt b/external/exportimport.pt index c6258c8..d739389 100644 --- a/external/exportimport.pt +++ b/external/exportimport.pt @@ -30,26 +30,41 @@ - + + +
+
+ + -
+

+ + + + + +
+
+

-   + -
+

@@ -60,7 +75,7 @@ - +