File Photo-1.2.3-more_options.patch of Package zope-Photo
diff -ru Photo-1.2.3-orig/Photo/ExtPhotoImage.py Photo-1.2.3/Photo/ExtPhotoImage.py
--- Photo-1.2.3-orig/Photo/ExtPhotoImage.py 2003-04-25 20:25:21.000000000 +0200
+++ Photo-1.2.3/Photo/ExtPhotoImage.py 2007-01-09 16:13:00.771031132 +0100
@@ -71,7 +71,7 @@
return int(now - mtime)
security.declareProtected('View', 'index_html')
- def index_html(self, REQUEST, RESPONSE, format=''):
+ def index_html(self, REQUEST, RESPONSE, format='', quality=75, resolution=None):
return PhotoImage.inheritedAttribute('index_html')(self, REQUEST=REQUEST)
def _data(self):
@@ -82,7 +82,7 @@
def _PILdata(self):
return self._get_filename(self.filename)
- def _newImage(self, id, file, path, format=''):
+ def _newImage(self, id, file, path, format='', quality=75, resolution=None):
img = PhotoImage(id, path=path)
img.manage_file_upload(file, self._content_type(format = format))
return img
diff -ru Photo-1.2.3-orig/Photo/PhotoImage.py Photo-1.2.3/Photo/PhotoImage.py
--- Photo-1.2.3-orig/Photo/PhotoImage.py 2003-04-25 20:25:21.000000000 +0200
+++ Photo-1.2.3/Photo/PhotoImage.py 2007-01-09 16:13:00.772030999 +0100
@@ -34,6 +34,7 @@
from AccessControl import ClassSecurityInfo
from Globals import InitializeClass
from OFS.Image import Image
+from OFS.content_types import guess_content_type
import time
class PhotoImage(Image):
@@ -65,8 +66,8 @@
return int(now - mtime)
security.declareProtected('View', 'index_html')
- def index_html(self, REQUEST, RESPONSE, format=''):
- return PhotoImage.inheritedAttribute('index_html')(self, REQUEST=REQUEST)
+ def index_html(self, REQUEST, RESPONSE, format='', quality=75, resolution=None):
+ return PhotoImage.inheritedAttribute('index_html')(self, REQUEST=REQUEST, RESPONSE=RESPONSE)
def _data(self):
return str(self.data)
@@ -76,7 +77,7 @@
def _PILdata(self):
return StringIO(str(self.data))
- def _newImage(self, id, file, path, format=''):
+ def _newImage(self, id, file, path, format='', quality=75, resolution=None):
return PhotoImage(id, '', file, self._content_type(format = format))
def _isValid(self):
diff -ru Photo-1.2.3-orig/Photo/Photo.py Photo-1.2.3/Photo/Photo.py
--- Photo-1.2.3-orig/Photo/Photo.py 2003-04-25 20:25:21.000000000 +0200
+++ Photo-1.2.3/Photo/Photo.py 2007-01-09 16:15:04.557622187 +0100
@@ -50,6 +50,9 @@
except ImportError: pass
import time
+
+from zLOG import LOG
+
defaultdisplays = {'thumbnail': (128,128),
'xsmall': (200,200),
'small': (320,320),
@@ -137,7 +140,7 @@
security.declareProtected('View', 'tag')
def tag(self, display=None, height=None, width=None, cookie=0,
- alt=None, css_class=None, format='', **kw):
+ alt=None, css_class=None, format='', quality=75, resolution=None, **kw):
"""Return HTML img tag."""
# Get cookie if display is not specified.
@@ -146,10 +149,10 @@
# display may be set from a cookie.
if display is not None and self._displays.has_key(display):
- if not self._isGenerated(display,format=format):
+ if not self._isGenerated(display,format=format, quality=quality, resolution=resolution):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, 1, format=format)
- image = self._photos[(display,format)]
+ self._makeDisplayPhoto(display, 1, format=format, quality=quality,resolution=resolution)
+ image = self._photos[(display, format, quality,resolution)]
width, height = (image._width(), image._height())
# Set cookie for chosen size
if cookie:
@@ -192,7 +195,7 @@
security.declareProtected('View', 'exttag')
def exttag(self, prefix, display=None, height=None, width=None, cookie=0,
- alt=None, css_class=None, format='', **kw):
+ alt=None, css_class=None, format='', quality=75, resolution=None, **kw):
"""Return HTML img tag for serving outside Zope."""
# Get cookie if display is not specified.
@@ -201,10 +204,10 @@
# display may be set from a cookie.
if display is not None and self._displays.has_key(display):
- if not self._isGenerated(display, format=format):
+ if not self._isGenerated(display, format=format, quality=quality,resolution=resolution):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, 1, format=format)
- image = self._photos[(display, format)]
+ self._makeDisplayPhoto(display, 1, format=format, quality=quality,resolution=resolution)
+ image = self._photos[(display, format, quality,resolution)]
width, height = (image._width(), image._height())
# Set cookie for chosen size
if cookie:
@@ -214,7 +217,7 @@
prefix = prefix + '/'
if display:
- filename = self._photos[(display, format)].filename
+ filename = self._photos[(display, format, quality,resolution)].filename
else:
filename = self._original.filename
@@ -276,11 +279,11 @@
return links
security.declareProtected('Access contents information', 'displayMap')
- def displayMap(self, exclude=None, format=''):
+ def displayMap(self, exclude=None, format='', quality=75, resolution=None):
"""Return list of displays with size info."""
displays = []
for id in self.displayIds(exclude):
- if self._isGenerated(id, format=format):
+ if self._isGenerated(id, format=format, quality=quality,resolution=resolution):
photo_width = self._photos[(id,format)]._width()
photo_height = self._photos[(id,format)]._height()
bytes = self._photos[(id,format)]._size()
@@ -298,20 +301,21 @@
return displays
security.declareProtected('View', 'index_html')
- def index_html(self, REQUEST, RESPONSE, display=None, format=''):
+ def index_html(self, REQUEST, RESPONSE, display=None, format='', quality=75, resolution=None):
"""Return the image data."""
# display may be set from a cookie (?)
- if display and self._displays.has_key(display):
- if not self._isGenerated(display, format=format):
+ if (display is not None or resolution is not None or quality != 75) and self._displays.has_key(display):
+ if not self._isGenerated(display, format=format, quality=quality,resolution=resolution):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, 1, format=format)
+ self._makeDisplayPhoto(display, 1, format=format, quality=quality,resolution=resolution)
else:
timeout = self.propertysheets.get('photoconf').getProperty('timeout')
- if timeout and self._photos[(display,format)]._age() > (timeout / 2):
- self._expireDisplays((display,), timeout, format=format)
+ if timeout and self._photos[(display,format,quality,resolution)]._age() > (timeout / 2):
+ self._expireDisplays(exclude=[], timeout=timeout, format=format, quality=quality, resolution=resolution)
+ #self._makeDisplayPhoto(display, 1, format=format, quality=quality,resolution=resolution)
# Return resized image
- return self._photos[(display,format)].index_html(REQUEST, RESPONSE, format=format)
+ return self._photos[(display,format,quality,resolution)].index_html(REQUEST, RESPONSE, format=format,quality=quality,resolution=resolution)
# Return original image
return self._original.index_html(REQUEST, RESPONSE)
@@ -345,7 +349,7 @@
# Photo processing
#
- def _resize(self, display, width, height, engine='ImageMagick', quality=75, format=''):
+ def _resize(self, display, width, height, engine='ImageMagick', quality=75, format='', resolution=None):
"""Resize and resample photo."""
origimg = self._original
newimg = StringIO()
@@ -359,21 +363,35 @@
from win32pipe import popen2
from tempfile import mktemp
newimg_path = mktemp(suffix=format)
- imgin, imgout = popen2('convert -quality %s -geometry %sx%s - %s'
+ if resolution is None:
+ imgin, imgout = popen2('convert -quality %s -geometry %sx%s - %s'
% (quality, width, height, newimg_path), 'b')
+ else:
+ imgin, imgout = popen2('convert -density %sx%s -quality %s -geometry %sx%s - %s'
+ % (resolution, resolution, quality, width, height, newimg_path), 'b')
+ imgin.write(origimg._IMdata())
+ imgin.close()
+ imgout.read()
+ imgout.close()
else:
- from popen2 import popen2
+ import popen2
import tempfile
tempdir = tempfile.tempdir
tempfile.tempdir = '/tmp'
newimg_path = tempfile.mktemp(suffix='.' + format)
tempfile.tempdir = tempdir
- imgout, imgin = popen2('convert -quality %s -geometry %sx%s - %s'
- % (quality, width, height, newimg_path))
- imgin.write(origimg._IMdata())
- imgin.close()
- imgout.read()
- imgout.close()
+ inpath=tempfile.mktemp()
+ infile=open(inpath,'w')
+ infile.write(origimg._IMdata())
+ infile.close()
+ if resolution is None:
+ cmd='convert -quality %s -geometry %sx%s %s %s' % (quality, width, height, inpath, newimg_path)
+ else:
+ LOG('Resolution',0,str(resolution))
+ cmd='convert -density %sx%s -quality %s -geometry %sx%s %s %s' % (resolution, resolution, quality, width, height, inpath, newimg_path)
+ p=popen2.Popen3(cmd)
+ p.wait()
+
newimg_file = open(newimg_path, 'r')
newimg.write(newimg_file.read())
newimg_file.close()
@@ -381,7 +399,7 @@
newimg.seek(0)
return newimg
- def _getDisplayData(self, display, format=''):
+ def _getDisplayData(self, display, format='', quality=None, resolution=None):
"""Return raw photo data for given display."""
(width, height) = self._displays[display]
if width == 0 and height == 0:
@@ -389,10 +407,10 @@
height = self._original._height()
(width, height) = self._getAspectRatioSize(width, height)
engine = self.propertysheets.get('photoconf').getProperty('engine')
- quality = self.propertysheets.get('photoconf').getProperty('quality')
- return self._resize(display, width, height, engine, quality, format=format)
+ if quality is None: quality = self.propertysheets.get('photoconf').getProperty('quality')
+ return self._resize(display, width, height, engine, quality, format=format,resolution=resolution)
- def _getDisplayPhoto(self, display, format=''):
+ def _getDisplayPhoto(self, display, format='', quality=75, resolution=None):
"""Return photo object for given display."""
try:
base, ext = string.split(self.id, '.')
@@ -400,17 +418,17 @@
except ValueError:
id = self.id+'_'+display
return self._original._newImage(id, self._getDisplayData(display,
- format=format), self.absolute_url(1), format=format)
+ format=format, quality=quality,resolution=resolution), self.absolute_url(1), format=format, quality=quality,resolution=resolution)
- def _makeDisplayPhoto(self, display, force=0, format=''):
+ def _makeDisplayPhoto(self, display, force=0, format='', quality=75, resolution=None):
"""Create given display."""
- if self._shouldGenerate(display, format=format) or force:
+ if self._shouldGenerate(display, format=format, quality=quality,resolution=resolution) or force:
photo = self._photos
- if photo.has_key((display,format)):
- photo[(display,format)].manage_upload(self._getDisplayData(display
- ,format=format), self.content_type(format=format))
+ if photo.has_key((display,format,quality,resolution)):
+ photo[(display, format, quality,resolution)].manage_upload(self._getDisplayData(display
+ ,format=format, quality=quality, resolution=resolution), self.content_type(format=format))
else:
- photo[(display,format)] = self._getDisplayPhoto(display,format=format)
+ photo[(display, format, quality,resolution)] = self._getDisplayPhoto(display,format=format, quality=quality,resolution=resolution)
self._photos = photo
def _makeDisplayPhotos(self):
@@ -431,16 +449,16 @@
"""At least see if it *might* be valid."""
return self._original._isValid()
- def _isGenerated(self, display, format=''):
+ def _isGenerated(self, display, format='', quality=75, resolution=None):
"""Return whether display has been generated."""
- return self._photos.has_key((display, format))
+ return self._photos.has_key((display, format, quality,resolution))
- def _shouldGenerate(self, display, format=''):
+ def _shouldGenerate(self, display, format='', quality=75, resolution=None):
"""Return whether display should be generated."""
- return (self._isGenerated(display, format=format) or
+ return (self._isGenerated(display, format=format, quality=quality,resolution=resolution) or
self.propertysheets.get('photoconf').getProperty('pregen'))
- def _expireDisplays(self, exclude=[], timeout=None, format=''):
+ def _expireDisplays(self, exclude=[], timeout=None, format='', quality=75, resolution=None):
"""Remove displays that have expired."""
if timeout is None:
@@ -633,6 +651,12 @@
if not hasattr(self, '_original'):
# Added Photo (vs. imported)
# See note in PUT()
+ ## XXX XXXXXXXXXXXXXXXXXXXXXXXXXXX
+ if not hasattr(self, 'properties') :
+ return
+ if self.properties.get('photoconf', None) is None :
+ return
+ ## /XXX added by jerome
store = self.propertysheets.get('photoconf').getProperty('store')
if store == 'Image': from PhotoImage import PhotoImage
elif store == 'ExtImage': from ExtPhotoImage import PhotoImage