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