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
openSUSE Build Service is sponsored by