diff --git a/integrator/collection.py b/integrator/collection.py index 2a04185..9e4dbca 100644 --- a/integrator/collection.py +++ b/integrator/collection.py @@ -171,7 +171,8 @@ class DirectoryCollectionProvider(object): storageParams=dict(subdirectory=directory), contentType=contentType, ) - adapted(obj).externalAddress = addr # must be set lasst + adobj = adapted(obj) + adobj.externalAddress = addr # must be set last yield obj def getDirectory(self, client): diff --git a/integrator/office/base.py b/integrator/office/base.py index 57f073e..3d96f99 100644 --- a/integrator/office/base.py +++ b/integrator/office/base.py @@ -25,6 +25,7 @@ $Id$ from datetime import date from time import strptime from lxml import etree +import os import shutil from zipfile import ZipFile from zope.cachedescriptors.property import Lazy @@ -57,7 +58,9 @@ class OfficeFile(ExternalFileAdapter): def setExternalAddress(self, addr): super(OfficeFile, self).setExternalAddress(addr) - self.processDocument() + root, ext = os.path.splitext(self.externalAddress) + if ext.lower() in ('.docx', '.xlsm'): + self.processDocument() externalAddress = property(ExternalFileAdapter.getExternalAddress, setExternalAddress) @@ -65,7 +68,6 @@ class OfficeFile(ExternalFileAdapter): storage = component.getUtility(IExternalStorage, name=self.storageName) subDir = self.storageParams.get('subdirectory') fn = storage.getDir(self.externalAddress, subDir) - # TODO: check if suitable file type (.docx, .xlsm) # open ZIP file, process properties, set version property in file try: zf = ZipFile(fn, 'r') @@ -85,7 +87,7 @@ class OfficeFile(ExternalFileAdapter): for p in dom: name = p.attrib.get('name') value = p[0].text - #print '***', name, value, p[0].tag + #print '***', self.externalAddress, name, value, p[0].tag attr = self.propertyMap.get(name) if attr == 'version': docVersion = value diff --git a/versioning/versionable.py b/versioning/versionable.py index 8d95fae..4130913 100644 --- a/versioning/versionable.py +++ b/versioning/versionable.py @@ -31,7 +31,7 @@ from zope.traversing.api import getName, getParent from cybertools.text.mimetypes import extensions from cybertools.typology.interfaces import IType -from loops.interfaces import IResource +from loops.interfaces import IResource, IExternalFile from loops.versioning.interfaces import IVersionable @@ -141,8 +141,23 @@ class VersionableResource(object): + ['title', 'description', 'data', 'contentType']) adaptedContext = ti and ti(context) or context 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: 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 def createVersion(self, level=1, comment=u''): @@ -162,12 +177,17 @@ class VersionableResource(object): def generateName(self, name, ext, versionId): if ext: - ext = '.' + ext if ext and name.endswith(ext): name = name[:-len(ext)] - elif len(name) > 3 and name[-4] == '.': - ext = name[-4:] - name = name[:-4] + else: + parts = name.rsplit('.', 1) + 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