[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