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