[Zope3-checkins] SVN: Zope3/branches/ZopeX3-3.0/src/zope/app/form/
Backport r26163 fixing issue 231.
Stephan Richter
srichter at cosmos.phy.tufts.edu
Wed Jul 7 13:13:18 EDT 2004
Log message for revision 26167:
Backport r26163 fixing issue 231.
-=-
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/form/__init__.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/form/__init__.py 2004-07-07 17:03:59 UTC (rev 26166)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/form/__init__.py 2004-07-07 17:13:18 UTC (rev 26167)
@@ -14,10 +14,7 @@
"""
$Id$
"""
-import traceback
-from warnings import warn
-from zope.app import zapi
-from zope.app.form.interfaces import IWidget, WidgetInputError
+from zope.app.form.interfaces import IWidget, InputErrors
from zope.component.interfaces import IViewFactory
from zope.interface import implements
from zope.i18n import translate
@@ -72,7 +69,7 @@
try:
self.validate()
return True
- except WidgetInputError:
+ except InputErrors:
return False
def validate(self):
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/exception.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/exception.py 2004-07-07 17:03:59 UTC (rev 26166)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/exception.py 2004-07-07 17:13:18 UTC (rev 26167)
@@ -41,7 +41,17 @@
>>> err = WidgetInputError("foo", "Foo", TooSmallError())
>>> view = WidgetInputErrorView(err, None)
>>> view.snippet()
- '<span class="error">Foo input < 1</span>'
+ u'<span class="error">Foo input < 1</span>'
+
+ The only method that IWidgetInputError promises to implement is
+ `doc()`. Therefore, other implementations of the interface should also
+ work.
+
+ >>> from zope.app.form.interfaces import ConversionError
+ >>> err = ConversionError('Could not convert to float.')
+ >>> view = WidgetInputErrorView(err, None)
+ >>> view.snippet()
+ u'<span class="error">Could not convert to float.</span>'
"""
- return '<span class="error">%s</span>' %(
- escape(self.context.errors.doc()))
+ return u'<span class="error">%s</span>' %(
+ escape(self.context.doc()))
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/widget.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/widget.py 2004-07-07 17:03:59 UTC (rev 26166)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/form/browser/widget.py 2004-07-07 17:13:18 UTC (rev 26167)
@@ -26,6 +26,8 @@
from zope.app import zapi
from zope.app.tests import ztapi
from zope.app.form import Widget, InputWidget
+from zope.app.form.interfaces import ConversionError
+from zope.app.form.interfaces import InputErrors
from zope.app.form.interfaces import WidgetInputError, MissingInputError
from zope.app.form.browser.interfaces import IBrowserWidget
from zope.app.form.browser.interfaces import ISimpleInputWidget
@@ -173,7 +175,7 @@
to its field:
>>> import re
- >>> field.constraint = re.compile(".*hello.*").match
+ >>> field.constraint = re.compile('.*hello.*').match
Because we modified the widget's name, the widget will now read different
different form input:
@@ -226,6 +228,34 @@
>>> widget.getInputValue() is field.missing_value
True
+ Another type of exception is a conversion error. It is raised when a value
+ cannot be converted to the desired Python object. Here is an example of a
+ floating point.
+
+ >>> from zope.schema import Float
+ >>> field = Float(__name__='price', title=u'Price')
+
+ >>> from zope.app.form.interfaces import ConversionError
+ >>> class FloatWidget(SimpleInputWidget):
+ ... def _toFieldValue(self, input):
+ ... try:
+ ... return float(input)
+ ... except ValueError, v:
+ ... raise ConversionError('Invalid floating point data', v)
+
+ >>> request = TestRequest(form={'field.price': u'32.0'})
+ >>> widget = FloatWidget(field, request)
+ >>> widget.getInputValue()
+ 32.0
+
+ >>> request = TestRequest(form={'field.price': u'foo'})
+ >>> widget = FloatWidget(field, request)
+ >>> try:
+ ... widget.getInputValue()
+ ... except ConversionError, error:
+ ... print error.doc()
+ Invalid floating point data
+
>>> tearDown()
"""
@@ -259,7 +289,12 @@
raise MissingInputError(self.name, self.label, None)
# convert input to suitable value - may raise conversion error
- value = self._toFieldValue(self._getFormInput())
+ try:
+ value = self._toFieldValue(self._getFormInput())
+ except ConversionError, error:
+ # ConversionError is already a WidgetInputError
+ self._error = error
+ raise self._error
# allow missing values only for non-required fields
if value == field.missing_value and not field.required:
@@ -330,7 +365,7 @@
if self.hasInput():
try:
value = self.getInputValue()
- except WidgetInputError:
+ except InputErrors:
return self.request.form.get(self.name, self._missing)
else:
value = self._getDefault()
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/form/interfaces.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/form/interfaces.py 2004-07-07 17:03:59 UTC (rev 26166)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/form/interfaces.py 2004-07-07 17:13:18 UTC (rev 26167)
@@ -24,6 +24,9 @@
class IWidgetInputError(Interface):
"""Placeholder for a snippet View"""
+ def doc():
+ """Returns a string that represents the error message."""
+
class WidgetInputError(UserError):
"""One or more user input errors occurred."""
@@ -39,20 +42,30 @@
self.widget_title = widget_title
self.errors = errors
+ def doc(self):
+ return self.errors.doc()
+
+
class MissingInputError(WidgetInputError):
"""Required data was not supplied."""
-class ConversionError(WidgetInputError):
+
+class ConversionError(Exception):
"""A conversion error occurred."""
+ implements(IWidgetInputError)
+
def __init__(self, error_name, original_exception=None):
Exception.__init__(self, error_name, original_exception)
self.error_name = error_name
self.original_exception = original_exception
-InputErrors = WidgetInputError, ValidationError
+ def doc(self):
+ return self.error_name
+InputErrors = WidgetInputError, ValidationError, ConversionError
+
class ErrorContainer(Exception):
"""A base error class for collecting multiple errors."""
More information about the Zope3-Checkins
mailing list