[Checkins] SVN: z3c.imagewidget/trunk/src/z3c/imagewidget/ use z3c.image to resize automatically in form

Bernd Dorn bernd.dorn at fhv.at
Tue Oct 10 06:08:52 EDT 2006


Log message for revision 70595:
  use z3c.image to resize automatically in form

Changed:
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/DEPENDENCIES.cfg
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/form.py
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/widget.py

-=-
Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/DEPENDENCIES.cfg
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/DEPENDENCIES.cfg	2006-10-09 22:08:57 UTC (rev 70594)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/DEPENDENCIES.cfg	2006-10-10 10:08:50 UTC (rev 70595)
@@ -1 +1,2 @@
 z3c.sessionwidget
+z3c.image
\ No newline at end of file

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt	2006-10-09 22:08:57 UTC (rev 70594)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt	2006-10-10 10:08:50 UTC (rev 70595)
@@ -20,6 +20,7 @@
   >>> import zope.schema
   >>> from zope.app.file.interfaces import IImage
   >>> imgField = zope.schema.Object(
+  ...     __name__=u'img',
   ...     title=u'Image', schema=IImage)
 
   >>> imgWidget = widget.ImageInputWidget(imgField, request)
@@ -63,7 +64,7 @@
 You can also generate the URL for the image for display:
 
   >>> editForm.imageURL
-  '.../++session++z3c.sessionwidget.SessionInputWidget/field./++item++data/'
+  u'.../++session++z3c.sessionwidget.SessionInputWidget/field.img/++item++data/'
 
 When uploading an empty image, the image is set to None:
 
@@ -144,7 +145,75 @@
   <z3c.imagewidget.form.AddImageForm object at ...>
 
 
-TO DO
------
+Enforcing Display Size of an Image
+----------------------------------
 
-Use PIL to enforce size.
+To enforce the size of an image, we have to subclass the ImageWidget
+and provide class attributes on the widget.
+
+  >>> class MySizedImageWidget(widget.ImageInputWidget):
+  ...     width = 100
+  ...     height = 100
+
+In order to test this we need a real image, which we get from the
+testing package of z3c.image.
+
+  >>> from z3c.image import testing
+  >>> image = testing.getTestImage('flower.jpg')
+  >>> image.getImageSize()
+  (103, 118)
+
+We have defined the size constraint to 100, 100 so the image should be
+resized if we add the value.
+
+  >>> imgWidget = MySizedImageWidget(imgField, request)
+  >>> imgWidget.name='data'
+  >>> imgWidget.session['changed']=False
+  >>> imgWidget.session['data']=None
+  >>> addForm = form.AddImageForm(imgWidget, request)
+  >>> addForm.createAndAdd({'data': image.data})
+  >>> imgWidget.session['data'].getImageSize()
+  (87, 100)
+
+Also the edit form resizes the image if needed.
+
+  >>> editForm = form.EditImageForm(imgWidget.session['data'], request)
+  >>> editForm.widget = imgWidget
+  >>> editForm.adapters = {}
+  >>> editForm.handle_edit_action.success({'data': image.data})
+
+So now we have no changes, since we resized the same image as
+before.
+
+  >>> imgWidget.session['data'].getImageSize()
+  (87, 100)
+  >>> editForm.status
+  ''
+
+So let us define som other data.
+
+  >>> editForm.handle_edit_action.success({'data': '%PNG...'})
+  >>> editForm.status
+  u'Image updated.'
+
+This was no real image data, so no size information can be
+extracted. The resizing does not happen.
+
+  >>> imgWidget.session['data'].getImageSize()
+  (-1, -1)
+
+We now send our flower image again. Whis is stell larger than 100, 100
+of course.
+
+  >>> image.getImageSize()
+  (103, 118)
+  >>> editForm.handle_edit_action.success({'data': image.data})
+  >>> editForm.status
+  u'Image updated.'
+
+And is now resized.
+
+  >>> imgWidget.session['data'].getImageSize()
+  (87, 100)
+  
+

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/form.py
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/form.py	2006-10-09 22:08:57 UTC (rev 70594)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/form.py	2006-10-10 10:08:50 UTC (rev 70595)
@@ -28,6 +28,34 @@
 from z3c.sessionwidget.widget import SESSION_KEY
 
 
+def _resize(data, w, h):
+    # do nothing if we have no size constraints
+    if w is None and h is None:
+        return data
+    img = Image(data)
+    # if we can get no content type do nothing
+    if not img.contentType:
+        return data
+    # defer this import, so we have no hard dependency at runtime
+    from z3c.image.proc.browser import getMaxSize
+    iw, ih = size = img.getImageSize()
+    width = w or iw
+    height = h or ih
+    new_size = getMaxSize(size, (width, height))
+    # if we have no changes return the value
+    if new_size == size:
+        return img
+    from z3c.image.proc.interfaces import IProcessableImage
+    pimg = IProcessableImage(img)
+    pimg.resize(new_size)
+    processed = pimg.process()
+    data = processed.data
+    if type(data) != str:
+        f = data
+        data = f.read()
+        f.close()
+    return data
+
 class AddImageForm(form.AddFormBase):
     """Add an image.
 
@@ -42,8 +70,12 @@
     def createAndAdd(self, data):
         imagedata = data.get('data')
         if imagedata:
+            imagedata = _resize(imagedata,
+                                self.context.width,
+                                self.context.height)
             image = Image(imagedata)
             self.context.session['data'] = image
+            #self.context.setRenderedValue(image)
             self.context.session['changed'] = True
 
 
@@ -66,9 +98,13 @@
     def handle_edit_action(self, action, data):
         if data['data'] == '':
             self.widget.session['data'] = None
-        elif form.applyChanges(
-            self.context, self.form_fields, data, self.adapters):
-            self.status = _('Image updated.')
+        else:
+            data['data'] = _resize(data['data'],
+                                   self.widget.width,
+                                   self.widget.height)
+            if form.applyChanges(
+                self.context, self.form_fields, data, self.adapters):
+                self.status = _('Image updated.')
         self.widget.session['changed'] = True
 
     @property

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py	2006-10-09 22:08:57 UTC (rev 70594)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py	2006-10-10 10:08:50 UTC (rev 70595)
@@ -21,14 +21,14 @@
 import zope.component
 from zope.app.session import interfaces
 from zope.app.session import session
-from zope.app.testing import placelesssetup
+from zope.app.testing import setup
 from zope.app.session.http import CookieClientIdManager
 from zope.publisher.interfaces import IRequest
 from zope.testing.doctestunit import DocFileSuite
+from z3c.image.proc.adapter import ProcessableImage
 
-
 def setUp(test):
-    placelesssetup.setUp()
+    setup.placefulSetUp()
     zope.component.provideAdapter(
         session.ClientId, (IRequest,), interfaces.IClientId)
     zope.component.provideAdapter(
@@ -38,9 +38,11 @@
     zope.component.provideUtility(
         session.PersistentSessionDataContainer(),
         interfaces.ISessionDataContainer)
+    zope.component.provideAdapter(ProcessableImage)
 
+
 def tearDown(test):
-    placelesssetup.tearDown()
+    setup.placefulTearDown()
 
 
 def test_suite():

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/widget.py
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/widget.py	2006-10-09 22:08:57 UTC (rev 70594)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/widget.py	2006-10-10 10:08:50 UTC (rev 70595)
@@ -21,6 +21,7 @@
 
 import z3c.sessionwidget
 from z3c.imagewidget import interfaces
+from z3c.image.proc.interfaces import IProcessableImage
 
 class ImageInputWidget(z3c.sessionwidget.SessionInputWidget):
     """Image input widget."""
@@ -28,3 +29,4 @@
 
     width = fieldproperty.FieldProperty(interfaces.IImageWidget['width'])
     height = fieldproperty.FieldProperty(interfaces.IImageWidget['height'])
+



More information about the Checkins mailing list