[Checkins] SVN: megrok.form/branches/ Adding z3c.blobfile support
branch
Dirceu Pereira Tiegs
dirceutiegs at gmail.com
Sun Mar 9 07:59:29 EDT 2008
Log message for revision 84552:
Adding z3c.blobfile support branch
Changed:
A megrok.form/branches/
A megrok.form/branches/z3c.blobfile_support/
U megrok.form/branches/z3c.blobfile_support/setup.py
U megrok.form/branches/z3c.blobfile_support/src/megrok/form/TODO.txt
A megrok.form/branches/z3c.blobfile_support/src/megrok/form/blobfile.py
U megrok.form/branches/z3c.blobfile_support/src/megrok/form/fields.py
A megrok.form/branches/z3c.blobfile_support/src/megrok/form/imageinputwidget.pt
U megrok.form/branches/z3c.blobfile_support/src/megrok/form/interfaces.py
U megrok.form/branches/z3c.blobfile_support/src/megrok/form/overrides.zcml
U megrok.form/branches/z3c.blobfile_support/src/megrok/form/tests/test_form.py
A megrok.form/branches/z3c.blobfile_support/src/megrok/form/widgets.py
-=-
Copied: megrok.form/branches/z3c.blobfile_support (from rev 84361, megrok.form/trunk)
Modified: megrok.form/branches/z3c.blobfile_support/setup.py
===================================================================
--- megrok.form/trunk/setup.py 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/setup.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -34,6 +34,7 @@
'z3c.widget',
'zc.datetimewidget',
'collective.namedfile',
+ 'z3c.blobfile',
],
entry_points="""
# Add entry points here
Modified: megrok.form/branches/z3c.blobfile_support/src/megrok/form/TODO.txt
===================================================================
--- megrok.form/trunk/src/megrok/form/TODO.txt 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/TODO.txt 2008-03-09 11:59:29 UTC (rev 84552)
@@ -2,8 +2,6 @@
megrok.form TODO
================
-- Release the egg
-
- Add input tests for all widgets
- Get rid of megrok.form.browser.tzinfo
Added: megrok.form/branches/z3c.blobfile_support/src/megrok/form/blobfile.py
===================================================================
--- megrok.form/branches/z3c.blobfile_support/src/megrok/form/blobfile.py (rev 0)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/blobfile.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -0,0 +1,13 @@
+from zope.interface import implements
+from z3c.blobfile.file import File
+from collective.namedfile.interfaces import INamedFile, INamedImage
+
+class NamedBlobFile(File):
+ implements(INamedFile)
+
+ def __init__(self, data='', contentType='', filename=None):
+ File.__init__(self, data, contentType)
+ self.filename=filename
+
+class NamedBlobImage(NamedBlobFile):
+ implements(INamedImage)
Modified: megrok.form/branches/z3c.blobfile_support/src/megrok/form/fields.py
===================================================================
--- megrok.form/trunk/src/megrok/form/fields.py 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/fields.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -1,6 +1,9 @@
from zope import interface, schema
+from collective.namedfile.interfaces import INamedFile, INamedImage
from collective.namedfile.field import NamedImage as Image
from collective.namedfile.field import NamedFile as File
+from blobfile import NamedBlobFile as BlobFileValueType
+from blobfile import NamedBlobImage as BlobImageValueType
import constraints
import interfaces
@@ -10,4 +13,10 @@
super(Email, self).__init__(**kw)
class HTML(schema.Text):
- interface.implements(interfaces.IHTML)
\ No newline at end of file
+ interface.implements(interfaces.IHTML)
+
+class NamedBlobFile(schema.Field):
+ interface.implements(INamedFile, interfaces.INamedBlobFile)
+
+class NamedBlobImage(NamedBlobFile):
+ interface.implements(INamedImage, interfaces.INamedBlobImage)
\ No newline at end of file
Added: megrok.form/branches/z3c.blobfile_support/src/megrok/form/imageinputwidget.pt
===================================================================
--- megrok.form/branches/z3c.blobfile_support/src/megrok/form/imageinputwidget.pt (rev 0)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/imageinputwidget.pt 2008-03-09 11:59:29 UTC (rev 84552)
@@ -0,0 +1,37 @@
+<tal:widget
+ tal:define="value options/value;
+ fieldname options/name;
+ exists python: value is not None;">
+ <input type="hidden" value=""
+ tal:attributes="name string:${view/name}.used; id string:${view/name}.used" />
+ <span tal:condition="exists">
+ <img tal:attributes="src string:${request/URL}/@@file/${fieldname}/${value/filename}" /><br />
+ <a tal:content="value/filename"
+ tal:attributes="href string:${request/URL}/@@file/${fieldname}/${value/filename}">Filename</a>
+ <span class="discreet"> — <span tal:define="sizekb python:value.getSize()/1024" tal:replace="sizekb">100</span> KB</span>
+ </span>
+ <div tal:condition="exists" style="padding-top: 1em;">
+ <input type="radio" value="nochange" checked="checked" class="noborder"
+ tal:attributes="name string:${view/name}.nochange;
+ id string:${view/name}.nochange;
+ onclick string:document.getElementById('${view/name}').disabled=true;" />
+ <label tal:attributes="for string:${view/name}.nochange">Keep existing image</label>
+ <br />
+ <input type="radio" value="" class="noborder"
+ tal:attributes="name string:${view/name}.nochange;
+ id string:${view/name}.replace;
+ onclick string:document.getElementById('${view/name}').disabled=false;" />
+ <label tal:attributes="for string:${view/name}.replace">Replace with new image</label>
+ </div>
+ <div tal:attributes="style python:exists and 'padding-left: 1.5em;; padding-top: 0.5em;;' or nothing">
+ <input type="file"
+ tal:attributes="name view/name;
+ id view/name;
+ size view/displayWidth;
+ maxlength python:view.displayMaxWidth > 0 or nothing;
+ class view/cssClass;" />
+ <script tal:condition="exists" type="text/javascript"
+ tal:content="string:document.getElementById('${view/name}').disabled=true;">
+ </script>
+ </div>
+</tal:widget>
\ No newline at end of file
Modified: megrok.form/branches/z3c.blobfile_support/src/megrok/form/interfaces.py
===================================================================
--- megrok.form/trunk/src/megrok/form/interfaces.py 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/interfaces.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -1,4 +1,10 @@
-from zope import schema
+from zope import interface, schema
class IHTML(schema.interfaces.ITextLine):
- u"""Field containing a HTML unicode string."""
\ No newline at end of file
+ u"""Field containing a HTML unicode string."""
+
+class INamedBlobFile(interface.Interface):
+ u"""Marker interface for blob files."""
+
+class INamedBlobImage(interface.Interface):
+ u"""Marker interface for blob images."""
\ No newline at end of file
Modified: megrok.form/branches/z3c.blobfile_support/src/megrok/form/overrides.zcml
===================================================================
--- megrok.form/trunk/src/megrok/form/overrides.zcml 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/overrides.zcml 2008-03-09 11:59:29 UTC (rev 84552)
@@ -16,4 +16,20 @@
permission="zope.Public"
/>
+ <view
+ type="zope.publisher.interfaces.browser.IBrowserRequest"
+ for=".interfaces.INamedBlobFile"
+ provides="zope.app.form.interfaces.IInputWidget"
+ factory=".widgets.NamedBlobFileWidget"
+ permission="zope.Public"
+ />
+
+ <view
+ type="zope.publisher.interfaces.browser.IBrowserRequest"
+ for=".interfaces.INamedBlobImage"
+ provides="zope.app.form.interfaces.IInputWidget"
+ factory=".widgets.NamedBlobImageWidget"
+ permission="zope.Public"
+ />
+
</configure>
Modified: megrok.form/branches/z3c.blobfile_support/src/megrok/form/tests/test_form.py
===================================================================
--- megrok.form/trunk/src/megrok/form/tests/test_form.py 2008-02-28 16:59:28 UTC (rev 84361)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/tests/test_form.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -2,7 +2,7 @@
from zope import component, interface, schema
from zope.publisher.browser import TestRequest
from zope.schema.interfaces import ConstraintNotSatisfied
-from megrok.form.fields import Email, Image, HTML, File
+from megrok.form.fields import Email, Image, HTML, File, NamedBlobFile, NamedBlobImage
import unittest
class MeGrokFormTest(grok.Application, grok.Container):
@@ -17,17 +17,21 @@
description = HTML(title=u"Description")
birthday = schema.Date(title=u"Birthday")
resume = File(title=u"Resume")
+ video = NamedBlobFile(title=u"Favorite Video")
+ wallpaper = NamedBlobImage(title=u"Favorite Wallpaper")
class Person(grok.Model):
interface.implements(IPerson)
- def __init__(self, name, email, picture, description, birthday, resume):
+ def __init__(self, name, email, picture, description, birthday, resume, video, wallpaper):
self.name = name
self.email = email
self.picture = picture
self.description = description
self.birthday = birthday
self.resume = resume
+ self.video = video
+ self.wallpaper = wallpaper
class AddPerson(grok.AddForm):
grok.context(MeGrokFormTest)
@@ -74,6 +78,14 @@
# test rendered file widget
s = """<div class="widget">\n\t<input type="hidden" value="" name="form.resume.used"\n id="form.resume.used" />\n\t\n\t\n\t<div>\n\t\t<input type="file" maxlength="True" class="" size="30"\n name="form.resume" id="form.resume" />\n\t\t\n\t</div>\n</div>"""
assert(s in rendered_form)
+
+ # test rendered blobfile widget
+ s = """<div class="widget">\n\t<input type="hidden" value="" name="form.video.used"\n id="form.video.used" />\n\t\n\t\n\t<div>\n\t\t<input type="file" maxlength="True" class="" size="30"\n name="form.video" id="form.video" />\n\t\t\n\t</div>\n</div>"""
+ assert(s in rendered_form)
+
+ # test rendered blobimage widget
+ s = """<div class="widget">\n\t<input type="hidden" value="" name="form.wallpaper.used"\n id="form.wallpaper.used" />\n\t\n\t\n\t<div>\n\t\t<input type="file" maxlength="True" class="" size="30"\n name="form.wallpaper" id="form.wallpaper" />\n\t\t\n\t</div>\n</div>"""
+ assert(s in rendered_form)
def test_email_default_constraint(self):
"""
Added: megrok.form/branches/z3c.blobfile_support/src/megrok/form/widgets.py
===================================================================
--- megrok.form/branches/z3c.blobfile_support/src/megrok/form/widgets.py (rev 0)
+++ megrok.form/branches/z3c.blobfile_support/src/megrok/form/widgets.py 2008-03-09 11:59:29 UTC (rev 84552)
@@ -0,0 +1,26 @@
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from collective.namedfile.widget import NamedFileWidget
+from fields import NamedBlobFile
+
+class NamedBlobFileWidget(NamedFileWidget):
+ """A correctly working Blob File widget.
+
+ The standard FileWidget returns a string instead of an IFile inst,
+ which means it will always fail schema validation in formlib.
+
+ In addition this widget will also extract the filename and Content-Type
+ from the request.
+ """
+ def _toFieldValue(self, input):
+ value=super(NamedFileWidget, self)._toFieldValue(input)
+ if value is not self.context.missing_value:
+ filename=getattr(input, "filename", None)
+ contenttype=input.headers.get("content-type",
+ "application/octet-stream")
+ value=NamedBlobFile(value, contenttype, filename)
+
+ return value
+
+class NamedBlobImageWidget(NamedBlobFileWidget):
+ """A image widget simply uses a different template to display the image"""
+ template = ViewPageTemplateFile('imageinputwidget.pt')
\ No newline at end of file
More information about the Checkins
mailing list