dolmen.widget.image 1.0b1
Image widget (with thumbnails) for `zeam.form`
dolmen.widget.image is a thin layer above dolmen.widget.file providing a widget suitable to fields implementing IImageField. It adds, thanks to dolmen.thumbnailer a preview of the uploaded image in both input and display mode.
Example
We are going to develop here a small example, to demonstrate the use of dolmen.widget.image. First, we instanciate our test model and add an image field to the object:
>>> class Mammoth(object): ... pass >>> import dolmen.file >>> import grokcore.component as grok >>> from zope.interface import Interface, alsoProvides >>> from zope.schema.fieldproperty import FieldProperty >>> class IMammothId(Interface): ... """Even mammoths need an ID card""" ... picture = dolmen.file.ImageField(title=u'Luggages') >>> manfred = Mammoth() >>> manfred.picture = None >>> alsoProvides(manfred, IMammothId)
The picture is now set on our Mammoth. We create a form to try and edit the picture field:
>>> from zeam.form.ztk import Form, Fields
>>> class EditMammoth(Form):
... grok.name('edit')
... grok.context(IMammothId)
... ignoreContent = False
... fields = Fields(IMammothId)
>>> grok.testing.grok_component('edit', EditMammoth)
True
We persist our Mammoth to get a located mammoth with an URL:
>>> from zope.component.hooks import getSite >>> root = getSite() >>> root['manfred'] = manfred >>> manfred = root['manfred']
We can call the edit form on our persisted object:
>>> from zope.component import getMultiAdapter
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> form = getMultiAdapter((manfred, request), name='edit')
>>> form.updateWidgets()
>>> print form.fieldWidgets.get('form.field.picture').render()
<div id="form-field-picture">
<input type="file" id="form-field-picture-input"
name="form.field.picture" />
</div>
Now, let's try with a fake value:
>>> manfred.picture = "some fake image"
>>> form = getMultiAdapter((manfred, request), name='edit')
>>> form.updateWidgets()
>>> print form.fieldWidgets.get('form.field.picture').render()
<div id="form-field-picture">
<div>
<div class="widget-image-preview">
<img src="http://127.0.0.1/manfred/++thumbnail++picture.preview"
title="Download" />
</div>
<p class="file-info">
<a class="filename"
href="http://127.0.0.1/manfred/++download++picture">Download</a>
</p>
</div>
<div>
<input type="radio" value="keep" checked="checked"
class="noborder" name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=true"
id="form-field-picture-action" />
<label for="form-field-picture-action">Keep existing file</label>
<br />
<input type="radio" value="delete" class="noborder"
name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=true"
id="form-field-picture-delete" />
<label for="form-field-picture-delete">Delete existing file</label>
<br />
<input type="radio" value="replace" class="noborder"
name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=false"
id="form-field-picture-replace" />
<label for="form-field-picture-replace">Replace with new file</label>
</div>
<div>
<input type="file" id="form-field-picture-input"
name="form.field.picture" />
<script type="text/javascript">document.getElementById('form-field-picture-input').disabled=true;</script>
</div>
</div>
With non persistent objects (which don't resolve to an URL), no preview is displayed. If we can't resolve to an URL, we can't serve the thumbnail or download the data:
>>> judith = Mammoth()
>>> judith.picture = "Fake image data"
>>> alsoProvides(judith, IMammothId)
>>> form = getMultiAdapter((judith, request), name='edit')
>>> form.updateWidgets()
>>> print form.fieldWidgets.get('form.field.picture').render()
<div id="form-field-picture">
<div>
<input type="radio" value="keep" checked="checked"
class="noborder" name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=true"
id="form-field-picture-action" />
<label for="form-field-picture-action">Keep existing file</label>
<br />
<input type="radio" value="delete" class="noborder"
name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=true"
id="form-field-picture-delete" />
<label for="form-field-picture-delete">Delete existing file</label>
<br />
<input type="radio" value="replace" class="noborder"
name="form.field.picture.action"
onclick="document.getElementById('form-field-picture-input').disabled=false"
id="form-field-picture-replace" />
<label for="form-field-picture-replace">Replace with new file</label>
</div>
<div>
<input type="file" id="form-field-picture-input"
name="form.field.picture" />
<script type="text/javascript">document.getElementById('form-field-picture-input').disabled=true;</script>
</div>
</div>
Changelog
1.0b1 (2010-07-05)
- The package now uses the latest improvements in the field registration process, in both zeam.form and dolmen.widget.file.
1.0a2 (2010-06-25)
- Updated the field registration to work with the latest zeam.form.ztk improvement : registration by entry points.
1.0a1 (2010-05-14)
- Major change : the widget is now meant to be used in zeam.form. Dolmen is no longer using z3c.form.
- The HTML code of the widget has been improved.
0.2 (2010-03-01)
- Updated the code to use dolmen.widget.file 0.2 and dolmen.file 0.5.1.
- Updated the template to use the zope.size.ISized adapter to display the file size.
- Updated the tests to get rid of the unneeded zope.app packages.
0.1 (2009-10-22)
- Initial release
| File | Type | Py Version | Uploaded on | Size | # downloads |
|---|---|---|---|---|---|
| dolmen.widget.image-1.0b1.tar.gz (md5) | Source | 2010-07-05 | 6KB | 503 | |
- Author: Souheil Chelfouh
- Keywords: Grok Zeam Zope3 Dolmen Widget Image
- License: GPL
- Platform: Any
- Categories
- Package Index Owner: trollfot
- DOAP record: dolmen.widget.image-1.0b1.xml
