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

View file

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

View file

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