[Erp5-report] r35240 nicolas - /erp5/trunk/products/ERP5/Document/Image.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed May 12 18:02:49 CEST 2010


Author: nicolas
Date: Wed May 12 18:02:44 2010
New Revision: 35240

URL: http://svn.erp5.org?rev=35240&view=rev
Log:
Refactoring of Image conversion.
  * use DEFAULT_QUALITY constant
  * Postpone the test off relevance conversion parameters in order to check
    if resizing is not needed to fit display ratio.
    If test succeed then call convert, otherwise return raw image (getData).
  * remove _getDisplayPhoto and merge is code inside _makeDisplayPhoto
    because this method is called from only one statement and factorisation
    is null


Modified:
    erp5/trunk/products/ERP5/Document/Image.py

Modified: erp5/trunk/products/ERP5/Document/Image.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Image.py?rev=35240&r1=35239&r2=35240&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Image.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/Image.py [utf8] Wed May 12 18:02:44 2010
@@ -44,6 +44,7 @@
 from Products.ERP5.Document.File import File
 from Products.ERP5.Document.Document import Document, ConversionError,\
                                                          VALID_TEXT_FORMAT_LIST
+from os.path import splitext
 from OFS.Image import Image as OFSImage
 from OFS.Image import getImageInfo
 from zLOG import LOG, WARNING
@@ -191,7 +192,7 @@
 
   security.declareProtected('View', 'tag')
   def tag(self, display=None, height=None, width=None, cookie=0,
-                alt=None, css_class=None, format='', quality=75,
+                alt=None, css_class=None, format=None, quality=DEFAULT_QUALITY,
                 resolution=None, frame=None, **kw):
     """Return HTML img tag."""
     self._upradeImage()
@@ -202,24 +203,18 @@
 
     # display may be set from a cookie.
     image_size = self.getSizeFromImageDisplay(display)
-    if (display is not None or resolution is not None or quality!=75 or format != ''\
-                            or frame is not None) and image_size:
-      kw = dict(display=display, format=format, quality=quality,
-                resolution=resolution, frame=frame, image_size=image_size)
-      try:
-        mime, image = self.getConversion(**kw)
-      except KeyError:
-        # Generate photo on-the-fly
-        mime, image = self._makeDisplayPhoto(**kw)
-        self.setConversion(image, mime, **kw)
-      width, height = (image.width, image.height)
-      # Set cookie for chosen size
-      if cookie:
-        self.REQUEST.RESPONSE.setCookie('display', display, path="/")
-    else:
-      # TODO: Add support for on-the-fly resize?
-      height = self.getHeight()
-      width = self.getWidth()
+    convert_kw = dict(format=format, quality=quality, resolution=resolution,
+                      frame=frame, image_size=image_size)
+    try:
+      mime, image = self.getConversion(**convert_kw)
+    except KeyError:
+      # Generate photo on-the-fly
+      mime, image = self._makeDisplayPhoto(image_size, **convert_kw)
+      self.setConversion(image, mime, **convert_kw)
+    width, height = image.width, image.height
+    # Set cookie for chosen size
+    if cookie:
+      self.REQUEST.RESPONSE.setCookie('display', display, path="/")
 
     if display:
       result = '<img src="%s?display=%s"' % (self.absolute_url(), display)
@@ -280,11 +275,13 @@
     return links
 
   security.declareProtected('Access contents information', 'displayMap')
-  def displayMap(self, exclude=None, format='', quality=75, resolution=None):
+  def displayMap(self, exclude=None, format='', quality=DEFAULT_QUALITY,
+                                                              resolution=None):
     """Return list of displays with size info."""
     displays = []
     for id in self.displayIds(exclude):
-      if self._isGenerated(id, format=format, quality=quality, resolution=resolution):
+      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()
@@ -327,7 +324,7 @@
 
   # Conversion API
   security.declareProtected(Permissions.AccessContentsInformation, 'convert')
-  def convert(self, format, display=None, quality=75, resolution=None, frame=None, **kw):
+  def convert(self, format, **kw):
     """
     Implementation of conversion for Image files
     """
@@ -339,18 +336,21 @@
         data = aq_base(data)
         self.setConversion(data, mime=mime_type, format=format)
         return mime_type, data
-    image_size = self.getSizeFromImageDisplay(display)
-    if (display is not None or resolution is not None or quality != 75 or format != ''\
-                            or frame is not None) and image_size:
-      kw = dict(display=display, format=format, quality=quality,
-                resolution=resolution, frame=frame, image_size=image_size)
-      try:
-        mime, image = self.getConversion(**kw)
-      except KeyError:
-        mime, image = self._makeDisplayPhoto(**kw)
-        self.setConversion(image, mime, **kw)
-      return mime, image.data
-    return self.getContentType(), self.getData()
+    image_size = self.getSizeFromImageDisplay(kw.get('display'))
+    # store all keys usefull to convert or resize an image
+    # 'display' parameter can be discarded
+    convert_kw = {'quality': kw.get('quality', DEFAULT_QUALITY),
+                  'resolution': kw.get('resolution'),
+                  'frame': kw.get('frame'),
+                  'image_size': image_size,
+                  'format': format,
+                 }
+    try:
+      mime, image = self.getConversion(**convert_kw)
+    except KeyError:
+      mime, image = self._makeDisplayPhoto(**convert_kw)
+      self.setConversion(image, mime, **convert_kw)
+    return mime, image.data
 
   # Display
   security.declareProtected('View', 'index_html')
@@ -366,8 +366,7 @@
   # Photo processing
   #
 
-  def _resize(self, display, width, height, quality=75, format='',
-                    resolution=None, frame=None):
+  def _resize(self, quality, width, height, format, resolution, frame):
     """Resize and resample photo."""
     newimg = StringIO()
 
@@ -413,43 +412,26 @@
     newimg.seek(0)
     return newimg
 
-  def _getDisplayData(self, display, format='', quality=75, resolution=None, frame=None,
-                      image_size=None):
+  def _getDisplayData(self, format, quality, resolution, frame, image_size):
     """Return raw photo data for given display."""
-    if display is None:
-      (width, height) = (self.getWidth(), self.getHeight())
-    elif image_size is None:
-      (width, height) = self.getSizeFromImageDisplay(display)
-    else:
-      (width, height) = image_size
-    if width == 0 and height == 0:
-      width = self.getWidth()
-      height = self.getHeight()
-    (width, height) = self._getAspectRatioSize(width, height)
-    if (width, height) == (0, 0):return self.getData()
-    return self._resize(display, width, height, quality, format=format,
-                        resolution=resolution, frame=frame)
-
-  def _getDisplayPhoto(self, display, format='', quality=75, resolution=None, frame=None,
-                       image_size=None):
-    """Return photo object for given display."""
-    try:
-        base, ext = string.split(self.id, '.')
-        id = base + '_' + display + '.' + ext
-    except ValueError:
-        id = self.id +'_'+ display
-    image = OFSImage(id, self.getTitle(), self._getDisplayData(display, format=format,
-                         quality=quality, resolution=resolution, frame=frame,
-                         image_size=image_size))
-    return image
-
-  def _makeDisplayPhoto(self, display, format='', quality=75, resolution=None, frame=None,
-                        image_size=None):
+    width, height = self._getAspectRatioSize(*image_size)
+    if ((width, height) == image_size or (width, height) == (0, 0))\
+       and quality == DEFAULT_QUALITY and resolution is None and frame is None\
+       and not format:
+      # No resizing, no conversion, return raw image
+      return self.getData()
+    return self._resize(quality, width, height, format, resolution, frame)
+
+  def _makeDisplayPhoto(self, format=None, quality=DEFAULT_QUALITY,
+                                 resolution=None, frame=None, image_size=None):
     """Create given display."""
-    image = self._getDisplayPhoto(display, format=format, quality=quality,
-                                           resolution=resolution, frame=frame,
-                                           image_size=image_size)
-    return (image.content_type, aq_base(image))
+    width, height = image_size
+    base, ext = splitext(self.id)
+    id = '%s_%s_%s.%s'% (base, width, height, ext,)
+    image = OFSImage(id, self.getTitle(), 
+                     self._getDisplayData(format, quality, resolution,
+                                                            frame, image_size))
+    return image.content_type, aq_base(image)
 
   def _getAspectRatioSize(self, width, height):
     """Return proportional dimensions within desired size."""




More information about the Erp5-report mailing list