[Checkins] SVN: z3c.form/trunk/src/z3c/form/ refactor: moving setErrors to property instead of method parameter

Adam Groszer agroszer at gmail.com
Sun Jan 4 11:56:32 EST 2009


Log message for revision 94501:
  refactor: moving setErrors to property instead of method parameter
  

Changed:
  U   z3c.form/trunk/src/z3c/form/browser/image.py
  U   z3c.form/trunk/src/z3c/form/field.py
  U   z3c.form/trunk/src/z3c/form/field.txt
  U   z3c.form/trunk/src/z3c/form/form.py
  U   z3c.form/trunk/src/z3c/form/interfaces.py
  U   z3c.form/trunk/src/z3c/form/object.py
  U   z3c.form/trunk/src/z3c/form/widget.py

-=-
Modified: z3c.form/trunk/src/z3c/form/browser/image.py
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/image.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/browser/image.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -34,7 +34,7 @@
     src = FieldProperty(IHTMLImageWidget['src'])
     klass = u'image-widget'
 
-    def extract(self, default=interfaces.NOVALUE, setErrors=True):
+    def extract(self, default=interfaces.NOVALUE):
         """See z3c.form.interfaces.IWidget."""
         if self.name + '.x' not in self.request:
             return default

Modified: z3c.form/trunk/src/z3c/form/field.py
===================================================================
--- z3c.form/trunk/src/z3c/form/field.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/field.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -182,6 +182,7 @@
     ignoreContext = False
     ignoreRequest = False
     ignoreReadonly = False
+    setErrors = True
 
     def __init__(self, form, request, content):
         super(FieldWidgets, self).__init__()
@@ -273,7 +274,7 @@
             self._data[shortName] = widget
             zope.location.locate(widget, self, shortName)
 
-    def extract(self, setErrors=True):
+    def extract(self):
         """See interfaces.IWidgets"""
         data = {}
         errors = ()
@@ -282,7 +283,8 @@
                 continue
             value = widget.field.missing_value
             try:
-                raw = widget.extract(setErrors=setErrors)
+                widget.setErrors = self.setErrors
+                raw = widget.extract()
                 if raw is not interfaces.NOVALUE:
                     value = interfaces.IDataConverter(widget).toFieldValue(raw)
                 zope.component.getMultiAdapter(
@@ -298,7 +300,7 @@
                     (error, self.request, widget, widget.field,
                      self.form, self.content), interfaces.IErrorViewSnippet)
                 view.update()
-                if setErrors:
+                if self.setErrors:
                     widget.error = view
                 errors += (view,)
             else:
@@ -310,6 +312,6 @@
                 interfaces.IErrorViewSnippet)
             view.update()
             errors += (view,)
-        if setErrors:
+        if self.setErrors:
             self.errors = errors
         return data, errors

Modified: z3c.form/trunk/src/z3c/form/field.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/field.txt	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/field.txt	2009-01-04 16:56:31 UTC (rev 94501)
@@ -733,10 +733,11 @@
   >>> manager.ignoreContext = True
   >>> manager.update()
 
-When calling the ``extract()`` method with the `setErrors` flag turned off, we
-still get the same result from the method call, ...
+We have to set the setErrors property to False before calling extract,
+we still get the same result from the method call, ...
 
-  >>> manager.extract(setErrors=False)
+  >>> manager.setErrors = False
+  >>> manager.extract()
   ({'firstName': u'Stephan'}, (<ErrorViewSnippet for RequiredMissing>,))
 
 but there are no side effects on the manager and the widgets:

Modified: z3c.form/trunk/src/z3c/form/form.py
===================================================================
--- z3c.form/trunk/src/z3c/form/form.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/form.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -132,7 +132,8 @@
 
     def extractData(self, setErrors=True):
         '''See interfaces.IForm'''
-        return self.widgets.extract(setErrors=setErrors)
+        self.widgets.setErrors = setErrors
+        return self.widgets.extract()
 
     def update(self):
         '''See interfaces.IForm'''

Modified: z3c.form/trunk/src/z3c/form/interfaces.py
===================================================================
--- z3c.form/trunk/src/z3c/form/interfaces.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/interfaces.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -418,7 +418,15 @@
         default=False,
         required=False)
 
-    def extract(default=NOVALUE, setErrors=True):
+    #ugly thing to remove setErrors parameter from extract
+    setErrors = zope.schema.Bool(
+        title=_('Set errors'),
+        description=_('A flag, when set, the widget sets error messages '
+                      'on calling extract().'),
+        default=True,
+        required=False)
+
+    def extract(default=NOVALUE):
         """Extract the string value(s) of the widget from the form.
 
         The return value may be any Python construct, but is typically a
@@ -432,8 +440,6 @@
         not want to crash the system during an inproper request.
 
         If there is no value to extract, the default is to be returned.
-
-        setErrors: needs to be passed on to possible sub-widgets
         """
 
     def update():
@@ -595,14 +601,19 @@
         default=False,
         required=True)
 
+    #ugly thing to remove setErrors parameter from extract
+    setErrors = zope.schema.Bool(
+        title=_('Set errors'),
+        description=_('A flag, when set, the contained widgets set error '
+                      'messages on calling extract().'),
+        default=True,
+        required=False)
+
     def update():
         """Setup widgets."""
 
-    def extract(setErrors=True):
+    def extract():
         """Extract the values from the widgets and validate them.
-
-        setErrors: decides whether to set errors on self and on the widgets
-                   also needs to be passed on to sub-widgets
         """
 
 

Modified: z3c.form/trunk/src/z3c/form/object.py
===================================================================
--- z3c.form/trunk/src/z3c/form/object.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/object.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -44,6 +44,11 @@
         self.request = request
         self.__parent__ = parentWidget
         self.parentForm = parentWidget.form
+        self.ignoreContext = self.__parent__.ignoreContext
+        self.ignoreRequest = self.__parent__.ignoreRequest
+        if interfaces.IFormAware.providedBy(self.__parent__):
+            self.ignoreReadonly = self.parentForm.ignoreReadonly
+        self.prefix = self.__parent__.name
 
     def _validate(self):
         for widget in self.widgets.values():
@@ -71,36 +76,16 @@
     def setupFields(self):
         self.fields = Fields(self.__parent__.field.schema)
 
-    def update(self, ignoreContext=None, setErrors=True):
+    def update(self):
         if self.__parent__.field is None:
             raise ValueError("%r .field is None, that's a blocking point" % self.__parent__)
         #update stuff from parent to be sure
         self.mode = self.__parent__.mode
-        if ignoreContext is not None:
-            self.ignoreContext = ignoreContext
-        else:
-            self.ignoreContext = self.__parent__.ignoreContext
-        self.ignoreRequest = self.__parent__.ignoreRequest
-        if interfaces.IFormAware.providedBy(self.__parent__):
-            self.ignoreReadonly = self.parentForm.ignoreReadonly
 
-        #prefix = ''
-        #if self.parentForm:
-        #    prefix = util.expandPrefix(self.parentForm.prefix) + \
-        #        util.expandPrefix(self.parentForm.widgets.prefix)
-        #
-        #self.prefix = prefix+self.__parent__.field.__name__
-
-        self.prefix = self.__parent__.name
-
         self.setupFields()
 
         super(ObjectSubForm, self).update()
 
-        if setErrors:
-            #hmmm, do we need this here? seems to be over-validated
-            self._validate()
-
     def getContent(self):
         return self.__parent__._value
 
@@ -211,12 +196,13 @@
     def updateWidgets(self, setErrors=True):
         if self._value is not interfaces.NOVALUE:
             self._getForm(self._value)
-            ignore = None
         else:
             self._getForm(None)
-            ignore = True
+            self.subform.ignoreContext = True
 
-        self.subform.update(ignore, setErrors=setErrors)
+        self.subform.update()
+        if setErrors:
+            self.subform._validate()
 
     def update(self):
         #very-very-nasty: skip raising exceptions in extract while we're updating
@@ -253,7 +239,8 @@
         def get(self):
             #value (get) cannot raise an exception, then we return insane values
             try:
-                return self.extract(setErrors=True)
+                self.setErrors=True
+                return self.extract()
             except MultipleErrors:
                 value = {}
                 for name in zope.schema.getFieldNames(self.field.schema):
@@ -272,11 +259,11 @@
         return property(get, set)
 
 
-    def extract(self, default=interfaces.NOVALUE, setErrors=True):
+    def extract(self, default=interfaces.NOVALUE):
         if self.name+'-empty-marker' in self.request:
             self.updateWidgets(setErrors=False)
 
-            value, errors = self.subform.extractData(setErrors=setErrors)
+            value, errors = self.subform.extractData(setErrors=self.setErrors)
 
             if errors:
                 #very-very-nasty: skip raising exceptions in extract
@@ -306,13 +293,15 @@
 ######## make dummy objects providing a given interface to support
 ######## discriminating on field.schema
 
-class DummyObject(object):
-    zope.interface.implements(zope.interface.Interface)
-
 def makeDummyObject(iface):
-    dummy = DummyObject()
     if iface is not None:
-        zope.interface.directlyProvides(dummy, iface)
+        class DummyObject(object):
+            zope.interface.implements(iface)
+    else:
+        class DummyObject(object):
+            zope.interface.implements(zope.interface.Interface)
+
+    dummy = DummyObject()
     return dummy
 
 ######## special template factory that takes the field.schema into account

Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py	2009-01-04 15:44:48 UTC (rev 94500)
+++ z3c.form/trunk/src/z3c/form/widget.py	2009-01-04 16:56:31 UTC (rev 94501)
@@ -52,6 +52,7 @@
     value = FieldProperty(interfaces.IWidget['value'])
     template = None
     ignoreRequest = FieldProperty(interfaces.IWidget['ignoreRequest'])
+    setErrors = FieldProperty(interfaces.IWidget['setErrors'])
 
     # The following attributes are for convenience. They are declared in
     # extensions to the simple widget.
@@ -79,7 +80,8 @@
         if not self.ignoreRequest:
             #at this turn we do not need errors to be set on widgets
             #errors will be set when extract gets called from form.extractData
-            widget_value = self.extract(setErrors=False)
+            self.setErrors = False
+            widget_value = self.extract()
             if widget_value is not interfaces.NOVALUE:
                 # Once we found the value in the request, it takes precendence
                 # over everything and nothing else has to be done.
@@ -138,7 +140,7 @@
                 IPageTemplate, name=self.mode)
         return template(self)
 
-    def extract(self, default=interfaces.NOVALUE, setErrors=True):
+    def extract(self, default=interfaces.NOVALUE):
         """See z3c.form.interfaces.IWidget."""
         return self.request.get(self.name, default)
 
@@ -197,7 +199,7 @@
         self.updateTerms()
         super(SequenceWidget, self).update()
 
-    def extract(self, default=interfaces.NOVALUE, setErrors=True):
+    def extract(self, default=interfaces.NOVALUE):
         """See z3c.form.interfaces.IWidget."""
         if (self.name not in self.request and
             self.name+'-empty-marker' in self.request):
@@ -353,7 +355,7 @@
             self.updateWidgets()
         return property(get, set)
 
-    def extract(self, default=interfaces.NOVALUE, setErrors=True):
+    def extract(self, default=interfaces.NOVALUE):
         # This method is responsible to get the widgets value based on the
         # request and nothing else.
         # We have to setup the widgets for extract their values, because we



More information about the Checkins mailing list