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:
		
							parent
							
								
									a761455e35
								
							
						
					
					
						commit
						ab4c01e88d
					
				
					 3 changed files with 75 additions and 10 deletions
				
			
		
							
								
								
									
										4
									
								
								external/base.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								external/base.py
									
										
									
									
										vendored
									
									
								
							|  | @ -184,8 +184,10 @@ class Extractor(Base): | |||
|                     name = getName(obj) | ||||
|                     yield self.getConceptOrResourceElement(name, obj) | ||||
|             elif action in ('assign', 'deassign'): | ||||
|                 child = util.getObjectForUid(tr.data['second']) | ||||
|                 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: | ||||
|                     # may have been deleted already - can be ignored | ||||
|                     continue | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ loops - Linked Objects for Organization and Processing Services | |||
| 
 | ||||
|   >>> from zope import component | ||||
|   >>> 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. | ||||
| 
 | ||||
|  | @ -19,11 +20,18 @@ Let's set up a loops site with basic and example concepts and resources. | |||
|   >>> len(concepts), len(resources), len(views) | ||||
|   (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 | ||||
| ============================================================ | ||||
| 
 | ||||
|   >>> from loops.system.sync.browser import SyncChanges | ||||
|   >>> from loops.system.sync.browser import SyncChanges, ChangesSync | ||||
|   >>> req = TestRequest() | ||||
|   >>> #view = SyncChanges() | ||||
| 
 | ||||
| 
 | ||||
| Fin de Partie | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ view class(es) for import/export. | |||
| $Id$ | ||||
| """ | ||||
| 
 | ||||
| from cStringIO import StringIO | ||||
| from logging import getLogger | ||||
| import os | ||||
| import time | ||||
| from zope import component | ||||
|  | @ -32,6 +34,7 @@ from zope.traversing.api import getName, getPath | |||
| 
 | ||||
| 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 | ||||
|  | @ -74,30 +77,82 @@ class ChangesSave(FormController): | |||
| 
 | ||||
|     @Lazy | ||||
|     def sitePath(self): | ||||
|         return getPath(self.view.virtualTargetObject)[1:].replace('/', '_') | ||||
|         return getPath(self.view.loopsRoot)[1:].replace('/', '_') | ||||
| 
 | ||||
|     @Lazy | ||||
|     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 | ||||
|     def targetView(self): | ||||
|         return self.view.virtualTarget | ||||
| 
 | ||||
|     def update(self): | ||||
|     @Lazy | ||||
|     def types(self): | ||||
|         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') | ||||
|         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) | ||||
|         elements = extractor.extractChanges(changed, types) | ||||
|         elements = extractor.extractChanges(self.changed, self.types) | ||||
|         writer = component.getUtility(IWriter) | ||||
|         f = open(os.path.join(self.exportDirectory, '_changes.dmp'), 'w') | ||||
|         writer.write(elements, f) | ||||
|         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): | ||||
| 
 | ||||
|     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 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm