Commit fb493724 authored by Jean-Paul Smets's avatar Jean-Paul Smets

Code review and refactoring based on Document API.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@13631 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent d7067b8b
This diff is collapsed.
...@@ -42,18 +42,6 @@ from DateTime import DateTime ...@@ -42,18 +42,6 @@ from DateTime import DateTime
mimetypes.init() mimetypes.init()
rs=[]
rs.append(re.compile('<HEAD>.*</HEAD>',re.DOTALL|re.MULTILINE|re.IGNORECASE))
rs.append(re.compile('<!DOCTYPE[^>]*>'))
rs.append(re.compile('<.?(HTML|BODY)[^>]*>',re.DOTALL|re.MULTILINE|re.IGNORECASE))
def stripHtml(txt): # XXX-JPS to be moved to TextDocument
for r in rs:
txt=r.sub('',txt)
return txt
class File(Document, CMFFile, ConversionCacheMixin): class File(Document, CMFFile, ConversionCacheMixin):
""" """
A File can contain raw data which can be uploaded and downloaded. A File can contain raw data which can be uploaded and downloaded.
...@@ -86,15 +74,18 @@ class File(Document, CMFFile, ConversionCacheMixin): ...@@ -86,15 +74,18 @@ class File(Document, CMFFile, ConversionCacheMixin):
# Default Properties # Default Properties
property_sheets = ( PropertySheet.Base property_sheets = ( PropertySheet.Base
, PropertySheet.CategoryCore , PropertySheet.XMLObject
, PropertySheet.DublinCore , PropertySheet.CategoryCore
, PropertySheet.Version , PropertySheet.DublinCore
, PropertySheet.Reference , PropertySheet.Version
, PropertySheet.Document , PropertySheet.Reference
, PropertySheet.Data , PropertySheet.Document
, PropertySheet.Data
, PropertySheet.ExternalDocument
, PropertySheet.Url
, PropertySheet.Periodicity
) )
# Declarative interfaces # Declarative interfaces
#__implements__ = ( , ) #__implements__ = ( , )
...@@ -152,7 +143,7 @@ class File(Document, CMFFile, ConversionCacheMixin): ...@@ -152,7 +143,7 @@ class File(Document, CMFFile, ConversionCacheMixin):
self.reindexObject() self.reindexObject()
security.declarePrivate('_unpackData') security.declarePrivate('_unpackData')
def _unpackData(self,data): def _unpackData(self, data):
""" """
Unpack Pdata into string Unpack Pdata into string
""" """
...@@ -178,11 +169,9 @@ class File(Document, CMFFile, ConversionCacheMixin): ...@@ -178,11 +169,9 @@ class File(Document, CMFFile, ConversionCacheMixin):
return content_type return content_type
security.declareProtected(Permissions.ModifyPortalContent,'PUT') security.declareProtected(Permissions.ModifyPortalContent,'PUT')
def PUT(self,REQUEST,RESPONSE): def PUT(self, REQUEST, RESPONSE):
self.clearConversionCache() self.clearConversionCache()
CMFFile.PUT(self,REQUEST,RESPONSE) CMFFile.PUT(self, REQUEST, RESPONSE)
self.discoverMetadata(fname=self.getId())
# DAV Support # DAV Support
index_html = CMFFile.index_html index_html = CMFFile.index_html
...@@ -191,5 +180,3 @@ class File(Document, CMFFile, ConversionCacheMixin): ...@@ -191,5 +180,3 @@ class File(Document, CMFFile, ConversionCacheMixin):
manage_FTPget = CMFFile.manage_FTPget manage_FTPget = CMFFile.manage_FTPget
manage_FTPlist = CMFFile.manage_FTPlist manage_FTPlist = CMFFile.manage_FTPlist
manage_FTPstat = CMFFile.manage_FTPstat manage_FTPstat = CMFFile.manage_FTPstat
# vim: syntax=python shiftwidth=2
...@@ -94,12 +94,16 @@ class Image(File, OFSImage): ...@@ -94,12 +94,16 @@ class Image(File, OFSImage):
# Default Properties # Default Properties
property_sheets = ( PropertySheet.Base property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
, PropertySheet.CategoryCore , PropertySheet.CategoryCore
, PropertySheet.DublinCore , PropertySheet.DublinCore
, PropertySheet.Version , PropertySheet.Version
, PropertySheet.Reference , PropertySheet.Reference
, PropertySheet.Document , PropertySheet.Document
, PropertySheet.Data , PropertySheet.Data
, PropertySheet.ExternalDocument
, PropertySheet.Url
, PropertySheet.Periodicity
) )
# #
...@@ -188,7 +192,7 @@ class Image(File, OFSImage): ...@@ -188,7 +192,7 @@ class Image(File, OFSImage):
if not self.hasConversion(display=display, format=format, if not self.hasConversion(display=display, format=format,
quality=quality, resolution=resolution): quality=quality, resolution=resolution):
# Generate photo on-the-fly # Generate photo on-the-fly
self._makeDisplayPhoto(display, 1, format=format, quality=quality, resolution=resolution) self._makeDisplayPhoto(display, format=format, quality=quality, resolution=resolution)
mime, image = self.getConversion(display=display, format=format, mime, image = self.getConversion(display=display, format=format,
quality=quality ,resolution=resolution) quality=quality ,resolution=resolution)
width, height = (image.width, image.height) width, height = (image.width, image.height)
...@@ -290,10 +294,11 @@ class Image(File, OFSImage): ...@@ -290,10 +294,11 @@ class Image(File, OFSImage):
if not self.hasConversion(display=display, format=format, if not self.hasConversion(display=display, format=format,
quality=quality,resolution=resolution): quality=quality,resolution=resolution):
# Generate photo on-the-fly # Generate photo on-the-fly
self._makeDisplayPhoto(display, 1, format=format, quality=quality,resolution=resolution) self._makeDisplayPhoto(display, format=format, quality=quality,resolution=resolution)
# Return resized image # Return resized image
mime, image = self.getConversion(display=display, format=format, mime, image = self.getConversion(display=display, format=format,
quality=quality ,resolution=resolution) quality=quality ,resolution=resolution)
RESPONSE.setHeader('Content-Type', mime)
return image.index_html(REQUEST, RESPONSE) return image.index_html(REQUEST, RESPONSE)
# Return original image # Return original image
...@@ -307,7 +312,6 @@ class Image(File, OFSImage): ...@@ -307,7 +312,6 @@ class Image(File, OFSImage):
def _resize(self, display, width, height, quality=75, format='', resolution=None): def _resize(self, display, width, height, quality=75, format='', resolution=None):
"""Resize and resample photo.""" """Resize and resample photo."""
newimg = StringIO() newimg = StringIO()
os.putenv('TMPDIR', '/tmp') # because if we run zope as root, we have /root/tmp here and convert goes crazy
if sys.platform == 'win32': if sys.platform == 'win32':
from win32pipe import popen2 from win32pipe import popen2
...@@ -324,8 +328,9 @@ class Image(File, OFSImage): ...@@ -324,8 +328,9 @@ class Image(File, OFSImage):
imgout, imgin = popen2('convert -quality %s -geometry %sx%s - -' imgout, imgin = popen2('convert -quality %s -geometry %sx%s - -'
% (quality, width, height)) % (quality, width, height))
else: else:
LOG('Resolution',0,str(resolution)) # LOG('Resolution',0,str(resolution))
cmd = 'convert -density %sx%s -quality %s -geometry %sx%s - -' % (resolution, resolution, quality, width, height) cmd = 'convert -density %sx%s -quality %s -geometry %sx%s - -' % (resolution,
resolution, quality, width, height)
imgout, imgin = popen2(cmd) imgout, imgin = popen2(cmd)
imgin.write(str(self.getData())) imgin.write(str(self.getData()))
...@@ -357,9 +362,9 @@ class Image(File, OFSImage): ...@@ -357,9 +362,9 @@ class Image(File, OFSImage):
quality=quality,resolution=resolution)) quality=quality,resolution=resolution))
return image return image
def _makeDisplayPhoto(self, display, force=0, format='', quality=75, resolution=None): def _makeDisplayPhoto(self, display, format='', quality=75, resolution=None):
"""Create given display.""" """Create given display."""
if not self.hasConversion(display=display, format=format, quality=quality,resolution=resolution) or force: if not self.hasConversion(display=display, format=format, quality=quality,resolution=resolution):
image = self._getDisplayPhoto(display, format=format, quality=quality, resolution=resolution) image = self._getDisplayPhoto(display, format=format, quality=quality, resolution=resolution)
self.setConversion(image, mime=image.content_type, self.setConversion(image, mime=image.content_type,
display=display, format=format, display=display, format=format,
......
...@@ -125,7 +125,11 @@ class TextDocument(Document, TextContent): ...@@ -125,7 +125,11 @@ class TextDocument(Document, TextContent):
if format is None: if format is None:
# The default is to use ERP5 Forms to render the page # The default is to use ERP5 Forms to render the page
return self.view() return self.view()
return self.convert(format=format) mime, data = self.convert(format=format)
RESPONSE.setHeader('Content-Length', len(data))
RESPONSE.setHeader('Content-Type', mime)
RESPONSE.setHeader('Accept-Ranges', 'bytes')
return data
security.declareProtected(Permissions.View, 'convert') security.declareProtected(Permissions.View, 'convert')
def convert(self, format, **kw): def convert(self, format, **kw):
...@@ -136,30 +140,14 @@ class TextDocument(Document, TextContent): ...@@ -136,30 +140,14 @@ class TextDocument(Document, TextContent):
_setCacheHeaders(self, {'format' : format}) _setCacheHeaders(self, {'format' : format})
# Return the raw content # Return the raw content
if format == 'raw': if format == 'raw':
return self.getTextContent() return 'text/plain', self.getTextContent()
mime_type = getToolByName(self, 'mimetypes_registry').lookupExtension('name.%s' % format) mime_type = getToolByName(self, 'mimetypes_registry').lookupExtension('name.%s' % format)
src_mimetype = self.getTextFormat() src_mimetype = self.getTextFormat()
if not src_mimetype.startswith('text/'): if not src_mimetype.startswith('text/'):
src_mimetype = 'text/%s' % src_mimetype src_mimetype = 'text/%s' % src_mimetype
return getToolByName(self, 'portal_transforms').convertTo(mime_type, return mime_type, getToolByName(self, 'portal_transforms').convertTo(mime_type,
self.getTextContent(), object=self, mimetype=src_mimetype) self.getTextContent(), object=self, mimetype=src_mimetype)
def __call__(self): def __call__(self):
_setCacheHeaders(self, {}) _setCacheHeaders(self, {})
return Document.__call__(self) return Document.__call__(self)
### Content indexing methods
security.declareProtected(Permissions.View, 'getSearchableText')
def getSearchableText(self, md=None):
"""\
Used by the catalog for basic full text indexing
We should try to do some kind of file conversion here so that getTextContent
returns something more readable.
"""
searchable_text = "%s %s %s %s %s" % (self.getTitle(), self.getShortTitle(),
self.getDescription(),
self.getId(), self.getTextContent())
return searchable_text
# Compatibility with CMF Catalog / CPS sites
SearchableText = getSearchableText # XXX-JPS - Here wa have a security issue - ask seb what to do
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