Commit eaafd3bf authored by Nicolas Delaby's avatar Nicolas Delaby

Remove conversion ability of File

Compute hash of provided data, it content is same, return immediatly.
deprecate guessMimeType



git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@40968 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 6f910ab1
...@@ -37,6 +37,9 @@ from Products.CMFDefault.File import File as CMFFile ...@@ -37,6 +37,9 @@ from Products.CMFDefault.File import File as CMFFile
from Products.CMFCore.utils import getToolByName from Products.CMFCore.utils import getToolByName
from OFS.Image import Pdata from OFS.Image import Pdata
import cStringIO import cStringIO
from Products.ERP5Type.Utils import deprecated
import md5
def _unpackData(data): def _unpackData(data):
""" """
...@@ -104,7 +107,7 @@ class File(Document, CMFFile): ...@@ -104,7 +107,7 @@ class File(Document, CMFFile):
# if file field is empty(no file is uploaded), # if file field is empty(no file is uploaded),
# filename is empty string. # filename is empty string.
if filename: if filename:
self._setSourceReference(filename) self._setFilename(filename)
if self._isNotEmpty(file): if self._isNotEmpty(file):
self._setFile(file, precondition=precondition) self._setFile(file, precondition=precondition)
del kw['file'] del kw['file']
...@@ -122,6 +125,13 @@ class File(Document, CMFFile): ...@@ -122,6 +125,13 @@ class File(Document, CMFFile):
getcontentlength = get_size getcontentlength = get_size
def _setFile(self, data, precondition=None): def _setFile(self, data, precondition=None):
if data is not None and self.hasData() and \
md5.md5(str(data.read())).digest() ==\
md5.md5(str(self.getData())).digest():
# Compute md5 hash only if there is something to hash on both sides.
#
# Same data as previous, no need to change it's content
return
CMFFile._edit(self, precondition=precondition, file=data) CMFFile._edit(self, precondition=precondition, file=data)
security.declareProtected(Permissions.ModifyPortalContent,'setFile') security.declareProtected(Permissions.ModifyPortalContent,'setFile')
...@@ -136,22 +146,14 @@ class File(Document, CMFFile): ...@@ -136,22 +146,14 @@ class File(Document, CMFFile):
""" """
return self.hasData() return self.hasData()
security.declareProtected(Permissions.ModifyPortalContent, 'guessMimeType') security.declareProtected(Permissions.AccessContentsInformation, 'guessMimeType')
@deprecated
def guessMimeType(self, fname=None): def guessMimeType(self, fname=None):
""" """
get mime type from file name Deprecated
""" """
if not fname: return self.getPortalObject().portal_contributions.\
fname = self.getSourceReference() guessMimeTypeFromFilename(fname)
if fname:
portal = self.getPortalObject()
content_type = getToolByName(portal, 'mimetypes_registry').\
lookupExtension(fname)
if content_type is not None:
self.setContentType(content_type)
else:
content_type = None
return content_type
security.declareProtected(Permissions.ModifyPortalContent, '_setData') security.declareProtected(Permissions.ModifyPortalContent, '_setData')
def _setData(self, data): def _setData(self, data):
...@@ -247,90 +249,16 @@ class File(Document, CMFFile): ...@@ -247,90 +249,16 @@ class File(Document, CMFFile):
if content_type is 'text/html' and support conversion features of if content_type is 'text/html' and support conversion features of
TextDocument. TextDocument.
""" """
content_type = self.getContentType() content_type = self.getContentType() or ''
if format is None:
# Build the list of acceptable content_type for OOoDocument # No conversion is asked,
# Hopefully this is cached # we can return safely the file content itself
from Products.ERP5Type.Document import newTempOOoDocument return content_type, self.getData()
temp_odt = newTempOOoDocument(self, 'testOOoOdt') elif format in VALID_TEXT_FORMAT_LIST:
temp_odt.edit(base_content_type='application/vnd.oasis.opendocument.text', # This is acceptable to return empty string
base_data='not empty') # for a File we can not convert
temp_ods = newTempOOoDocument(self, 'testOOoOds') return 'text/plain', ''
temp_ods.edit( raise NotImplementedError
base_content_type='application/vnd.oasis.opendocument.spreadsheet',
base_data='not empty')
temp_odg = newTempOOoDocument(self, 'testOOoOdg')
temp_odg.edit(base_content_type='application/vnd.oasis.opendocument.draw',
base_data='not empty')
temp_odb = newTempOOoDocument(self, 'testOOoOdb')
temp_odb.edit(base_content_type='application/vnd.oasis.opendocument.base',
base_data='not empty')
supported_ooo_content_type_list = [item[0] for item in\
temp_odt.getTargetFormatItemList()]\
+ [item[0] for item in temp_ods.getTargetFormatItemList()]\
+ [item[0] for item in temp_odg.getTargetFormatItemList()]\
+ [item[0] for item in temp_odb.getTargetFormatItemList()]
portal = self.getPortalObject()
if content_type.startswith('text'):
# We can wrap it into TextDocument
from Products.ERP5Type.Document import newTempTextDocument
temp_document = newTempTextDocument(self, 'temp_%s' % self.getId(),
text_content=self.getData(),
content_type=content_type)
return temp_document.convert(format=format, **kw)
elif content_type.startswith('image'):
# We can wrap it into Image
from Products.ERP5Type.Document import newTempImage
temp_document = newTempImage(self, 'temp_%s' % self.getId(),
data=self.getData(),
content_type=content_type)
return temp_document.convert(format=format, **kw)
elif content_type == 'application/pdf':
# We can wrap it into PDFDocument
from Products.ERP5Type.Document import newTempPDFDocument
temp_document = newTempPDFDocument(self, 'temp_%s' % self.getId(),
data=self.getData(),
content_type=content_type)
return temp_document.convert(format=format, **kw)
elif content_type in supported_ooo_content_type_list:
# We can wrap it into OOoDocument
temp_document = newTempOOoDocument(self, 'temp_%s' % self.getId(),
text_content=self.getData(),
content_type=content_type)
return temp_document.convert(format=format, **kw)
elif content_type in portal.portal_transforms._mtmap:
# Look if portal_transforms can handle the content_type
# of this File
kw['format'] = format
if not self.hasConversion(**kw):
mime_type = str(getToolByName(portal, 'mimetypes_registry').\
lookupExtension('name.%s' % format))
result = portal.portal_transforms.convertToData(mime_type,
self.getData(),
object=self,
context=self,
mimetype=content_type)
if not result:
raise ConversionError('File conversion error. '
'portal_transforms failed to convert '\
'from %s to %s; %r' % (content_type, mime_type,
self))
self.setConversion(result, mime_type, **kw)
else:
mime_type, result = self.getConversion(**kw)
return mime_type, result
else:
# We didn't find suitable wrapper to convert this File
if format in VALID_TEXT_FORMAT_LIST:
# This is acceptable to return empty string
# for a File we can not convert
return 'text/plain', ''
elif format is None:
# No conversion is asked,
# we can return safely the file content itself
return content_type, self.getData()
raise NotImplementedError
# CMFFile also brings the IContentishInterface on CMF 2.2, remove it. # CMFFile also brings the IContentishInterface on CMF 2.2, remove it.
removeIContentishInterface(File) removeIContentishInterface(File)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment