copy external files (in the operating system) when creating a new version
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3947 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									bd95543460
								
							
						
					
					
						commit
						007ae89f22
					
				
					 3 changed files with 32 additions and 9 deletions
				
			
		|  | @ -171,7 +171,8 @@ class DirectoryCollectionProvider(object): | ||||||
|                             storageParams=dict(subdirectory=directory), |                             storageParams=dict(subdirectory=directory), | ||||||
|                             contentType=contentType, |                             contentType=contentType, | ||||||
|             ) |             ) | ||||||
|             adapted(obj).externalAddress = addr     # must be set lasst |             adobj = adapted(obj) | ||||||
|  |             adobj.externalAddress = addr     # must be set last | ||||||
|             yield obj |             yield obj | ||||||
| 
 | 
 | ||||||
|     def getDirectory(self, client): |     def getDirectory(self, client): | ||||||
|  |  | ||||||
|  | @ -25,6 +25,7 @@ $Id$ | ||||||
| from datetime import date | from datetime import date | ||||||
| from time import strptime | from time import strptime | ||||||
| from lxml import etree | from lxml import etree | ||||||
|  | import os | ||||||
| import shutil | import shutil | ||||||
| from zipfile import ZipFile | from zipfile import ZipFile | ||||||
| from zope.cachedescriptors.property import Lazy | from zope.cachedescriptors.property import Lazy | ||||||
|  | @ -57,6 +58,8 @@ class OfficeFile(ExternalFileAdapter): | ||||||
| 
 | 
 | ||||||
|     def setExternalAddress(self, addr): |     def setExternalAddress(self, addr): | ||||||
|         super(OfficeFile, self).setExternalAddress(addr) |         super(OfficeFile, self).setExternalAddress(addr) | ||||||
|  |         root, ext = os.path.splitext(self.externalAddress) | ||||||
|  |         if ext.lower() in ('.docx', '.xlsm'): | ||||||
|             self.processDocument() |             self.processDocument() | ||||||
|     externalAddress = property(ExternalFileAdapter.getExternalAddress, |     externalAddress = property(ExternalFileAdapter.getExternalAddress, | ||||||
|                                setExternalAddress) |                                setExternalAddress) | ||||||
|  | @ -65,7 +68,6 @@ class OfficeFile(ExternalFileAdapter): | ||||||
|         storage = component.getUtility(IExternalStorage, name=self.storageName) |         storage = component.getUtility(IExternalStorage, name=self.storageName) | ||||||
|         subDir = self.storageParams.get('subdirectory') |         subDir = self.storageParams.get('subdirectory') | ||||||
|         fn = storage.getDir(self.externalAddress, subDir) |         fn = storage.getDir(self.externalAddress, subDir) | ||||||
|         # TODO: check if suitable file type (.docx, .xlsm) |  | ||||||
|         # open ZIP file, process properties, set version property in file |         # open ZIP file, process properties, set version property in file | ||||||
|         try: |         try: | ||||||
|             zf = ZipFile(fn, 'r') |             zf = ZipFile(fn, 'r') | ||||||
|  | @ -85,7 +87,7 @@ class OfficeFile(ExternalFileAdapter): | ||||||
|         for p in dom: |         for p in dom: | ||||||
|             name = p.attrib.get('name') |             name = p.attrib.get('name') | ||||||
|             value = p[0].text |             value = p[0].text | ||||||
|             #print '***', name, value, p[0].tag |             #print '***', self.externalAddress, name, value, p[0].tag | ||||||
|             attr = self.propertyMap.get(name) |             attr = self.propertyMap.get(name) | ||||||
|             if attr == 'version': |             if attr == 'version': | ||||||
|                 docVersion = value |                 docVersion = value | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ from zope.traversing.api import getName, getParent | ||||||
| 
 | 
 | ||||||
| from cybertools.text.mimetypes import extensions | from cybertools.text.mimetypes import extensions | ||||||
| from cybertools.typology.interfaces import IType | from cybertools.typology.interfaces import IType | ||||||
| from loops.interfaces import IResource | from loops.interfaces import IResource, IExternalFile | ||||||
| from loops.versioning.interfaces import IVersionable | from loops.versioning.interfaces import IVersionable | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -141,8 +141,23 @@ class VersionableResource(object): | ||||||
|                     + ['title', 'description', 'data', 'contentType']) |                     + ['title', 'description', 'data', 'contentType']) | ||||||
|         adaptedContext = ti and ti(context) or context |         adaptedContext = ti and ti(context) or context | ||||||
|         adaptedObj = ti and ti(obj) or obj |         adaptedObj = ti and ti(obj) or obj | ||||||
|  |         if 'context' in attrs: | ||||||
|  |             attrs.remove('context') | ||||||
|  |         if IExternalFile.providedBy(adaptedObj): | ||||||
|  |             for name in ('data', 'externalAddress',): | ||||||
|  |                 attrs.remove(name) | ||||||
|         for attr in attrs: |         for attr in attrs: | ||||||
|             setattr(adaptedObj, attr, getattr(adaptedContext, attr)) |             setattr(adaptedObj, attr, getattr(adaptedContext, attr)) | ||||||
|  |         if IExternalFile.providedBy(adaptedObj): | ||||||
|  |             adaptedObj.storageParams = adaptedContext.storageParams | ||||||
|  |             adaptedObj.storageName = adaptedContext.storageName | ||||||
|  |             extAddr = adaptedContext.externalAddress | ||||||
|  |             newExtAddr = self.generateName(extAddr, | ||||||
|  |                                  extensions.get(context.contentType, ''), | ||||||
|  |                                  versionId) | ||||||
|  |             adaptedObj.externalAddress = newExtAddr | ||||||
|  |             adaptedObj.data = adaptedContext.data | ||||||
|  |             adaptedObj.externalAddress = newExtAddr # trigger post-processing | ||||||
|         return obj |         return obj | ||||||
| 
 | 
 | ||||||
|     def createVersion(self, level=1, comment=u''): |     def createVersion(self, level=1, comment=u''): | ||||||
|  | @ -162,12 +177,17 @@ class VersionableResource(object): | ||||||
| 
 | 
 | ||||||
|     def generateName(self, name, ext, versionId): |     def generateName(self, name, ext, versionId): | ||||||
|         if ext: |         if ext: | ||||||
|             ext = '.' + ext |  | ||||||
|             if ext and name.endswith(ext): |             if ext and name.endswith(ext): | ||||||
|                 name = name[:-len(ext)] |                 name = name[:-len(ext)] | ||||||
|         elif len(name) > 3 and name[-4] == '.': |         else: | ||||||
|             ext = name[-4:] |             parts = name.rsplit('.', 1) | ||||||
|             name = name[:-4] |             if len(parts) == 2 and len(parts[1]) <= 4: | ||||||
|  |                 name, ext = parts | ||||||
|  |         #elif len(name) > 3 and name[-4] == '.': | ||||||
|  |         #    ext = name[-4:] | ||||||
|  |         #    name = name[:-4] | ||||||
|  |         if not ext.startswith('.'): | ||||||
|  |             ext = '.' + ext | ||||||
|         return name + '_' + versionId + ext |         return name + '_' + versionId + ext | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm