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:
helmutm 2010-08-10 11:39:35 +00:00
parent bd95543460
commit 007ae89f22
3 changed files with 32 additions and 9 deletions

View file

@ -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):

View file

@ -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,7 +58,9 @@ class OfficeFile(ExternalFileAdapter):
def setExternalAddress(self, addr): def setExternalAddress(self, addr):
super(OfficeFile, self).setExternalAddress(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, 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

View file

@ -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