work in progress: loops site synchronization: transfer data to target system

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3732 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-02-15 21:41:53 +00:00
parent a761455e35
commit ab4c01e88d
3 changed files with 75 additions and 10 deletions

4
external/base.py vendored
View file

@ -184,8 +184,10 @@ class Extractor(Base):
name = getName(obj) name = getName(obj)
yield self.getConceptOrResourceElement(name, obj) yield self.getConceptOrResourceElement(name, obj)
elif action in ('assign', 'deassign'): elif action in ('assign', 'deassign'):
child = util.getObjectForUid(tr.data['second'])
pred = util.getObjectForUid(tr.data['predicate']) pred = util.getObjectForUid(tr.data['predicate'])
if pred == self.typePredicate:
continue
child = util.getObjectForUid(tr.data['second'])
if child is None or pred is None: if child is None or pred is None:
# may have been deleted already - can be ignored # may have been deleted already - can be ignored
continue continue

View file

@ -6,6 +6,7 @@ loops - Linked Objects for Organization and Processing Services
>>> from zope import component >>> from zope import component
>>> from zope.traversing.api import getName >>> from zope.traversing.api import getName
>>> from zope.publisher.browser import TestRequest
Let's set up a loops site with basic and example concepts and resources. Let's set up a loops site with basic and example concepts and resources.
@ -19,11 +20,18 @@ Let's set up a loops site with basic and example concepts and resources.
>>> len(concepts), len(resources), len(views) >>> len(concepts), len(resources), len(views)
(30, 3, 1) (30, 3, 1)
>>> from cybertools.tracking.btree import TrackingStorage
>>> from loops.system.job import JobRecord
>>> records = loopsRoot.getRecordManager()
>>> records['jobs'] = TrackingStorage(trackFactory=JobRecord)
Synchronize: Transfer Changes from one loops Site to Another Synchronize: Transfer Changes from one loops Site to Another
============================================================ ============================================================
>>> from loops.system.sync.browser import SyncChanges >>> from loops.system.sync.browser import SyncChanges, ChangesSync
>>> req = TestRequest()
>>> #view = SyncChanges()
Fin de Partie Fin de Partie

View file

@ -22,6 +22,8 @@ view class(es) for import/export.
$Id$ $Id$
""" """
from cStringIO import StringIO
from logging import getLogger
import os import os
import time import time
from zope import component from zope import component
@ -32,6 +34,7 @@ from zope.traversing.api import getName, getPath
from cybertools.browser.form import FormController from cybertools.browser.form import FormController
from cybertools.util.date import str2timeStamp, formatTimeStamp from cybertools.util.date import str2timeStamp, formatTimeStamp
from loops.browser.common import BaseView
from loops.browser.concept import ConceptView from loops.browser.concept import ConceptView
from loops.external.base import Extractor from loops.external.base import Extractor
from loops.external.interfaces import IWriter from loops.external.interfaces import IWriter
@ -74,30 +77,82 @@ class ChangesSave(FormController):
@Lazy @Lazy
def sitePath(self): def sitePath(self):
return getPath(self.view.virtualTargetObject)[1:].replace('/', '_') return getPath(self.view.loopsRoot)[1:].replace('/', '_')
@Lazy @Lazy
def exportDirectory(self): def exportDirectory(self):
return os.path.join(self.baseDirectory, 'export', self.sitePath) directory = os.path.join(self.baseDirectory, 'export',
'_'.join((self.sitePath,
getName(self.targetView.context))))
if not os.path.exists(directory):
os.makedirs(directory)
return directory
@Lazy @Lazy
def targetView(self): def targetView(self):
return self.view.virtualTarget return self.view.virtualTarget
def update(self): @Lazy
def types(self):
typeIds = self.targetView.options('types') typeIds = self.targetView.options('types')
types = [self.view.conceptManager[t] for t in typeIds] return [self.view.conceptManager[t] for t in typeIds]
@Lazy
def changed(self):
since = self.request.get('changed_since') since = self.request.get('changed_since')
changed = since and str2timeStamp(since) or self.targetView.lastSyncTimeStamp return since and str2timeStamp(since) or self.targetView.lastSyncTimeStamp
@Lazy
def transcript(self):
return StringIO()
def update(self):
self.export()
return True
def export(self):
self.clearExportDirectory()
extractor = Extractor(self.view.loopsRoot, self.exportDirectory) extractor = Extractor(self.view.loopsRoot, self.exportDirectory)
elements = extractor.extractChanges(changed, types) elements = extractor.extractChanges(self.changed, self.types)
writer = component.getUtility(IWriter) writer = component.getUtility(IWriter)
f = open(os.path.join(self.exportDirectory, '_changes.dmp'), 'w') f = open(os.path.join(self.exportDirectory, '_changes.dmp'), 'w')
writer.write(elements, f) writer.write(elements, f)
f.close() f.close()
return True
def clearExportDirectory(self):
for fn in os.listdir(self.exportDirectory):
os.unlink(os.path.join(self.exportDirectory, fn))
class ChangesSync(ChangesSave): class ChangesSync(ChangesSave):
pass def update(self):
self.export()
self.transfer()
self.triggerImport()
#self.recordExecution()
return True
def transfer(self):
targetPath = self.targetView.options('target')[0]
cmd = os.popen('scp -r %s %s' % (self.exportDirectory, targetPath))
info = cmd.read()
result = cmd.close()
if result:
message = '*** scp output: %s, return code: %s' % (info, result)
log = getLogger('loops.system.sync')
log.warn(message)
self.transcript.write(message + '\n')
def triggerImport(self):
pass
def recordExecution(self):
jobs = self.view.loopsRoot.getRecordManager()['jobs']
jobs.saveUserTrack()
class SyncImport(BaseView):
def importData(self):
pass