[Checkins] SVN: z3c.form/trunk/src/z3c/form/ Added missing_value support to data/time converters

Roger Ineichen roger at projekt01.ch
Sat Jun 16 02:36:39 EDT 2007


Log message for revision 76718:
  Added missing_value support to data/time converters
  Write more tests, now it's 100% tested again

Changed:
  U   z3c.form/trunk/src/z3c/form/CHANGES.txt
  U   z3c.form/trunk/src/z3c/form/converter.py
  U   z3c.form/trunk/src/z3c/form/converter.txt
  U   z3c.form/trunk/src/z3c/form/util.txt

-=-
Modified: z3c.form/trunk/src/z3c/form/CHANGES.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/CHANGES.txt	2007-06-15 19:46:30 UTC (rev 76717)
+++ z3c.form/trunk/src/z3c/form/CHANGES.txt	2007-06-16 06:36:37 UTC (rev 76718)
@@ -2,6 +2,23 @@
 CHANGES
 =======
 
+- Added missing_value support to data/time converters
+
+- 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.
+
+  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``
+
+- Fix extractFileName method, now it doesn't remove dots from a filename
+  Added a couple tests for extractFileName
+
 - Added named vocabulary lookup in ChoiceTerms and CollectionTerms
 
 - Implemented support for FileUpload in FileWidget

Modified: z3c.form/trunk/src/z3c/form/converter.py
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.py	2007-06-15 19:46:30 UTC (rev 76717)
+++ z3c.form/trunk/src/z3c/form/converter.py	2007-06-16 06:36:37 UTC (rev 76718)
@@ -68,6 +68,8 @@
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
+        if value == u'':
+            return self.field.missing_value
         return datetime.date(*[int(part) for part in value.split('-')])
 
 
@@ -78,6 +80,8 @@
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
+        if value == u'':
+            return self.field.missing_value
         return datetime.time(*[int(part) for part in value.split(':')])
 
 
@@ -88,6 +92,8 @@
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
+        if value == u'':
+            return self.field.missing_value
         dateString, timeString = value.split(' ')
         dt = [int(part) for part in dateString.split('-')]
         dt += [int(part) for part in timeString.split(':')]
@@ -101,6 +107,8 @@
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
+        if value == u'':
+            return self.field.missing_value
         daysString, crap, timeString = value.split(' ')
         days = int(daysString)
         seconds = [int(part)*60**(2-n)
@@ -120,7 +128,7 @@
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
         if value is None or value == '':
-            return self.context.missing_value
+            return self.field.missing_value
 
         if isinstance(value, zope.publisher.browser.FileUpload):
             # By default a IBytes field is used for get a file upload widget.
@@ -141,7 +149,7 @@
                 if data or getattr(value, 'filename', ''):
                     return data
                 else:
-                    return self.context.missing_value
+                    return self.field.missing_value
         else:
             return unicode(value)
 

Modified: z3c.form/trunk/src/z3c/form/converter.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.txt	2007-06-15 19:46:30 UTC (rev 76717)
+++ z3c.form/trunk/src/z3c/form/converter.txt	2007-06-16 06:36:37 UTC (rev 76718)
@@ -123,7 +123,13 @@
   >>> ddc.toFieldValue(u'1980-01-25')
   datetime.date(1980, 1, 25)
 
+By default the converter converts missing input to missin_input value:
 
+  >>> ddc.toFieldValue(u'') is None
+  True
+  
+
+
 Time Data Converter
 -------------------
 
@@ -150,7 +156,12 @@
   >>> tdc.toFieldValue(u'12:00:00')
   datetime.time(12, 0)
 
+By default the converter converts missing input to missin_input value:
 
+  >>> tdc.toFieldValue(u'') is None
+  True
+
+
 Datetime Data Converter
 -----------------------
 
@@ -177,7 +188,12 @@
   >>> dtdc.toFieldValue(u'1980-01-25 12:00:00')
   datetime.datetime(1980, 1, 25, 12, 0)
 
+By default the converter converts missing input to missin_input value:
 
+  >>> dtdc.toFieldValue(u'') is None
+  True
+
+
 Timedelta Data Converter
 ------------------------
 
@@ -204,7 +220,12 @@
   >>> tddc.toFieldValue(u'1 day, 1:01:01')
   datetime.timedelta(1, 3661)
 
+By default the converter converts missing input to missin_input value:
 
+  >>> tddc.toFieldValue(u'') is None
+  True
+
+
 FileUpload Data Converter
 -------------------------
 
@@ -215,14 +236,14 @@
   >>> fileWidget = z3c.form.browser.file.FileWidget(TestRequest())
   >>> bytes = zope.schema.Bytes()
 
-  >>> bdc = converter.FileUploadDataConverter(bytes, fileWidget)
-  >>> bdc
+  >>> fudc = converter.FileUploadDataConverter(bytes, fileWidget)
+  >>> fudc
   <DataConverter from Bytes to FileWidget>
 
 Bytes are converted to unicode:
 
   >>> simple = 'foobar'
-  >>> bdc.toFieldValue(simple)
+  >>> fudc.toFieldValue(simple)
   u'foobar'
 
 The converter can also convert FileUpload objects. Setup a fields storage 
@@ -244,10 +265,47 @@
 
 and try to convert:
 
-  >>> bdc.toFieldValue(myUpload)
+  >>> fudc.toFieldValue(myUpload)
   'File upload contents.'
 
+By default the converter converts missing input to missin_input value:
 
+  >>> fudc.toFieldValue(u'') is None
+  True
+
+If we get a emtpy filename for a fileupload, we also get the missing_value,
+but this means there was a error somewhere in the upload, normaly yo are
+not able to uppload a file without a filename:
+
+  >>> class EmptyFilenameFieldStorageStub:
+  ...     def __init__(self, file):
+  ...         self.file = file
+  ...         self.headers = {}
+  ...         self.filename = ''
+  >>> myfile = cStringIO.StringIO('')
+  >>> aFieldStorage = EmptyFilenameFieldStorageStub(myfile)
+  >>> myUpload = FileUpload(aFieldStorage)
+  >>> bytes = zope.schema.Bytes()
+  >>> fudc = converter.FileUploadDataConverter(bytes, fileWidget)
+  >>> fudc.toFieldValue(myUpload) is None
+  True
+
+There is also a ValueError if we don't get a seekable file from the FieldStorage 
+during the upload:
+
+  >>> myfile = ''
+  >>> aFieldStorage = FieldStorageStub(myfile)
+  >>> myUpload = FileUpload(aFieldStorage)
+  >>> bytes = zope.schema.Bytes()
+  >>> fudc = converter.FileUploadDataConverter(bytes, fileWidget)
+  >>> fudc.toFieldValue(myUpload) is None
+  Traceback (most recent call last):
+  ...
+  ValueError: (u'Bytes data is not a file object', <...AttributeError...>)
+
+
+
+
 Bytes Data Converter
 --------------------
 
@@ -277,7 +335,12 @@
   >>> fdc.toFieldValue(u'foobar')
   'foobar'
 
+By default the converter converts missing input to missin_input value:
 
+  >>> fdc.toFieldValue(u'') is None
+  True
+
+
 Sequence Data Converter
 -----------------------
 

Modified: z3c.form/trunk/src/z3c/form/util.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/util.txt	2007-06-15 19:46:30 UTC (rev 76717)
+++ z3c.form/trunk/src/z3c/form/util.txt	2007-06-16 06:36:37 UTC (rev 76718)
@@ -181,3 +181,43 @@
   Traceback (most recent call last):
   ...
   ValueError: Missing filename extension.
+
+
+extractContentType
+------------------
+
+there s alos a method which is able to extract the content type for a given
+file upload. We can use the stub form form the previous test.
+
+  >>> uploadForm = FileUploadFormStub()
+  >>> uploadForm.setFakeFileName('foo.txt')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'text/plain'
+
+  >>> uploadForm.setFakeFileName('foo.gif')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'image/gif'
+
+  >>> uploadForm.setFakeFileName('foo.jpg')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'image/jpeg'
+
+  >>> uploadForm.setFakeFileName('foo.png')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'image/png'
+
+  >>> uploadForm.setFakeFileName('foo.tif')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'image/tiff'
+
+  >>> uploadForm.setFakeFileName('foo.doc')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'application/msword'
+
+  >>> uploadForm.setFakeFileName('foo.zip')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'application/zip'
+
+  >>> uploadForm.setFakeFileName('foo.unknown')
+  >>> util.extractContentType(uploadForm, 'form.widgets.data')
+  'text/x-unknown-content-type'



More information about the Checkins mailing list