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) |                     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 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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): | ||||||
| 
 | 
 | ||||||
|  |     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 |         pass | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm