From e5077bb75b0f8b42a097621ef697bebef90af84d Mon Sep 17 00:00:00 2001 From: helmutm Date: Tue, 16 Feb 2010 18:53:41 +0000 Subject: [PATCH] work in progress: loops site synchronization: process import git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3738 fd906abe-77d9-0310-91a1-e0d9ade77398 --- external/base.py | 5 ++++- external/element.py | 11 ++++++++--- setup.py | 32 +++++++++++++++++++++++++++----- system/sync/browser.py | 23 +++++++++++++++++------ 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/external/base.py b/external/base.py index 9d920a1..bc5d557 100644 --- a/external/base.py +++ b/external/base.py @@ -284,7 +284,10 @@ class Extractor(Base): def getDeassignmentElement(self, obj, child, predicate): args = getName(obj), getName(child), getName(predicate) - return elementTypes['deassign'](*args) + kw = {} + if IConcept.providedBy(child): + kw['type'] = 'concept' + return elementTypes['deassign'](*args, **kw) def getConceptElement(self, name, obj): if obj.conceptType is None: diff --git a/external/element.py b/external/element.py index 07f3f51..bbcec6a 100644 --- a/external/element.py +++ b/external/element.py @@ -195,12 +195,17 @@ class DeassignmentElement(Element): elementType = 'deassign' posArgs = ('first', 'second', 'predicate') - def __init__(self, *args): + 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 execute(self, loader): - loader.deassignResource(self['first'], self['second'], self['predicate']) + if self.get('type') == 'child': + loader.deassignChild(self['first'], self['second'], self['predicate']) + else: + loader.deassignResource(self['first'], self['second'], self['predicate']) class NodeElement(Element): @@ -250,4 +255,4 @@ elementTypes = dict( ) toplevelElements = ('type', 'concept', 'resource', - 'child', 'resourceRelation', 'node') + 'child', 'resourceRelation', 'node', 'deassign') diff --git a/setup.py b/setup.py index a2879f9..4782504 100644 --- a/setup.py +++ b/setup.py @@ -149,7 +149,7 @@ class SetupManager(object): def setConceptAttribute(self, concept, attr, value): setattr(adapted(concept), attr, value) - self.log("Setting Attribute '%s' of '%s' to '%s'" % + self.log("Setting Attribute '%s' of '%s' to '%s'." % (attr, getName(concept), repr(value))) def assignChild(self, conceptName, childName, predicate=None, **kw): @@ -160,13 +160,24 @@ class SetupManager(object): concept = self.concepts[conceptName] child = self.concepts[childName] if child in concept.getChildren([predicate]): - self.log("Concept '%s' is already a child of '%s' with predicate '%s'.'" % + self.log("Concept '%s' is already a child of '%s' with predicate '%s'." % (childName, conceptName, getName(predicate))) else: concept.assignChild(child, predicate, **kw) - self.log("Concept '%s' assigned to '%s with predicate '%s'.'" % + self.log("Concept '%s' assigned to '%s' with predicate '%s'." % (childName, conceptName, getName(predicate))) + def deassignChild(self, conceptName, childName, predicate=None): + if predicate is None: + predicate = self.concepts.getDefaultPredicate() + if isinstance(predicate, basestring): + predicate = self.concepts[predicate] + concept = self.concepts[conceptName] + child = self.concepts[childName] + concept.deassignChild(child, [predicate]) + self.log("Concept '%s' deassigned from '%s' using predicate '%s'." % + (childName, conceptName, getName(predicate))) + def addResource(self, name, title, resourceType, description=u'', **kw): if name in self.resources: self.log("Resource '%s' ('%s') already exists." % (name, title)) @@ -189,13 +200,24 @@ class SetupManager(object): concept = self.concepts[conceptName] resource = self.resources[resourceName] if resource in concept.getResources([predicate]): - self.log("Resource '%s' is already assigned to '%s with predicate '%s'.'" % + self.log("Resource '%s' is already assigned to '%s' with predicate '%s'.'" % (resourceName, conceptName, getName(predicate))) else: concept.assignResource(resource, predicate, **kw) - self.log("Resource '%s' assigned to '%s with predicate '%s'.'" % + self.log("Resource '%s' assigned to '%s' with predicate '%s'." % (resourceName, conceptName, getName(predicate))) + def deassignResource(self, conceptName, resourceName, predicate=None): + if predicate is None: + predicate = self.concepts.getDefaultPredicate() + if isinstance(predicate, basestring): + predicate = self.concepts[predicate] + concept = self.concepts[conceptName] + resource = self.resources[resourceName] + concept.deassignResource(resource, [predicate]) + self.log("Resource '%s' deassigned from '%s' using predicate '%s'." % + (resourceName, conceptName, getName(predicate))) + def addNode(self, name, title, container=None, nodeType='page', description=u'', body=u'', target=None, factory=Node, **kw): if container is None: diff --git a/system/sync/browser.py b/system/sync/browser.py index a8c8ee1..b43524d 100644 --- a/system/sync/browser.py +++ b/system/sync/browser.py @@ -37,8 +37,8 @@ from cybertools.browser.form import FormController from cybertools.util.date import str2timeStamp, formatTimeStamp from loops.browser.common import BaseView from loops.browser.concept import ConceptView -from loops.external.base import Extractor -from loops.external.interfaces import IWriter +from loops.external.base import Extractor, Loader +from loops.external.interfaces import IReader, IWriter from loops.system.job import JobRecords from loops import util @@ -85,11 +85,13 @@ class ChangesSave(FormController): def sitePath(self): return getPath(self.view.loopsRoot)[1:].replace('/', '_') + @Lazy + def subDirectory(self): + return '_'.join((self.sitePath, getName(self.targetView.context))) + @Lazy def exportDirectory(self): - directory = os.path.join(self.baseDirectory, 'export', - '_'.join((self.sitePath, - getName(self.targetView.context)))) + directory = os.path.join(self.baseDirectory, 'export', self.subDirectory) if not os.path.exists(directory): os.makedirs(directory) return directory @@ -162,6 +164,7 @@ class ChangesSync(ChangesSave): path = p[1] else: path = p[0] + path = os.path.join(path, self.subDirectory) f = urlopen(targetUrl, data=urlencode(dict(path=path))) result = f.read() self.transcript.write('trigger import: %s\n' % result) @@ -180,5 +183,13 @@ class SyncImport(object): self.request = request def importData(self): - print '***', self.request.get('path', '???') + path = self.request.get('path', '???') + f = open(os.path.join(path, '_changes.dmp')) + data = f.read() + f.close() + reader = component.getUtility(IReader) + elements = reader.read(data) + loader = Loader(self.context, path) + loader.load(elements) + return loader.logger.getvalue() + '\n' + loader.transcript.getvalue() return 'Done'