[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"> &mdash; <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