[Checkins] SVN: z3c.form/trunk/src/z3c/form/con Changed registration of file upload data converter.

Roger Ineichen roger at projekt01.ch
Mon Jun 11 18:30:14 EDT 2007


Log message for revision 76629:
  Changed registration of file upload data converter.
  Register FileUploadDataConverter for IBytes/IFileWidget.
  This will force to use the data converter only for IFileWidget
  and not for IBytes at all. IBytes/IWidget uses by default the
  FieldDataConverter.
  
  Added tests
  
  Note:
  The default widget for IBytes is the IFileWidget. 
  
  What does this mean:
  If you need to use a text area widget for IBytes, you have to
  register a custom widget in the form because the default widget
  for IBytes is a file upload widget. You can do this by simply
  set ``fields['foobar'].widgetFactory = TextWidget``.

Changed:
  U   z3c.form/trunk/src/z3c/form/configure.zcml
  U   z3c.form/trunk/src/z3c/form/converter.py
  U   z3c.form/trunk/src/z3c/form/converter.txt

-=-
Modified: z3c.form/trunk/src/z3c/form/configure.zcml
===================================================================
--- z3c.form/trunk/src/z3c/form/configure.zcml	2007-06-11 21:24:31 UTC (rev 76628)
+++ z3c.form/trunk/src/z3c/form/configure.zcml	2007-06-11 22:30:13 UTC (rev 76629)
@@ -46,7 +46,7 @@
       factory=".converter.TimedeltaDataConverter"
       />
   <adapter
-      factory=".converter.BytesDataConverter"
+      factory=".converter.FileUploadDataConverter"
       />
   <adapter
       factory=".converter.SequenceDataConverter"

Modified: z3c.form/trunk/src/z3c/form/converter.py
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.py	2007-06-11 21:24:31 UTC (rev 76628)
+++ z3c.form/trunk/src/z3c/form/converter.py	2007-06-11 22:30:13 UTC (rev 76629)
@@ -108,14 +108,14 @@
         return datetime.timedelta(days, sum(seconds))
 
 
-class BytesDataConverter(FieldDataConverter):
+class FileUploadDataConverter(FieldDataConverter):
     """A special data converter for bytes, supporting also FileUpload.
 
     Since IBytes represents a file upload too, this converter can handle
     zope.publisher.browser.FileUpload object as given value.
     """
     zope.component.adapts(
-        zope.schema.interfaces.IBytes, interfaces.IWidget)
+        zope.schema.interfaces.IBytes, interfaces.IFileWidget)
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""

Modified: z3c.form/trunk/src/z3c/form/converter.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.txt	2007-06-11 21:24:31 UTC (rev 76628)
+++ z3c.form/trunk/src/z3c/form/converter.txt	2007-06-11 22:30:13 UTC (rev 76629)
@@ -205,17 +205,19 @@
   datetime.timedelta(1, 3661)
 
 
-Bytes Data Converter
---------------------
+FileUpload Data Converter
+-------------------------
 
 Since the ``Bytes`` field can contain a FileUpload object, we have to make
 sure we can convert FileUpload objects to bytes too.
 
+  >>> import z3c.form.browser.file
+  >>> fileWidget = z3c.form.browser.file.FileWidget(TestRequest())
   >>> bytes = zope.schema.Bytes()
 
-  >>> bdc = converter.BytesDataConverter(bytes, text)
+  >>> bdc = converter.FileUploadDataConverter(bytes, fileWidget)
   >>> bdc
-  <DataConverter from Bytes to Widget>
+  <DataConverter from Bytes to FileWidget>
 
 Bytes are converted to unicode:
 
@@ -246,7 +248,35 @@
   'File upload contents.'
 
 
+Bytes Data Converter
+--------------------
 
+The IBytes field uses a file upload widget which uses a file upload data 
+converter. This requires that we test the IBytes converter for normal IWidget.
+Note that IBytes always will get a FileUpload widget, if you need to use a
+text field for bytes, you have to register a custom widget using the 
+widgetFactory attribute of the z3c.form.interfaces.IField.
+
+  >>> bytes = zope.schema.Bytes()
+
+  >>> fdc = converter.FieldDataConverter(bytes, text)
+  >>> fdc
+  <DataConverter from Bytes to Widget>
+
+BytesLine are simply converted to string:
+
+  >>> value = 'foobar'
+
+  >>> fdc.toWidgetValue(value)
+  u'foobar'
+
+The converter only knows how to convert this particular format back to a
+datetime value:
+
+  >>> fdc.toFieldValue(u'foobar')
+  'foobar'
+
+
 Sequence Data Converter
 -----------------------
 



More information about the Checkins mailing list