[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