web/formwidgets.py
changeset 4304 0b53e850cdb5
parent 4252 6c4f109c2b03
child 4305 3d731478d9a8
--- a/web/formwidgets.py	Thu Jan 21 10:39:12 2010 +0100
+++ b/web/formwidgets.py	Thu Jan 21 10:42:37 2010 +0100
@@ -51,8 +51,48 @@
         """
         raise NotImplementedError
 
+    def typed_value(self, form, field):
+        """return field's *typed* value specified in:
+        3. extra form values given to render()
+        4. field's typed value
+        """
+        qname = field.input_name(form)
+        for key in (field, qname):
+            try:
+                return form.formvalues[key]
+            except KeyError:
+                continue
+        if field.name != qname and field.name in form.formvalues:
+            return form.formvalues[field.name]
+        return field.typed_value(form)
+
+    def format_value(self, form, field, value):
+        return field.format_value(form._cw, value)
+
     def values_and_attributes(self, form, field):
-        values = field.display_value(form)
+        """found field's *string* value in:
+        1. previously submitted form values if any (eg on validation error)
+        2. req.form
+        3. extra form values given to render()
+        4. field's typed value
+
+        values found in 1. and 2. are expected te be already some 'display'
+        value while those found in 3. and 4. are expected to be correctly typed.
+
+        3 and 4 are handle by the .typed_value(form, field) method
+        """
+        qname = field.input_name(form)
+        if qname in form.form_previous_values:
+            values = form.form_previous_values[qname]
+        elif qname in form._cw.form:
+            values = form._cw.form[qname]
+        elif field.name != qname and field.name in form._cw.form:
+            # compat: accept attr=value in req.form to specify value of attr-subject
+            values = form._cw.form[field.name]
+        else:
+            values = self.typed_value(form, field)
+            if values != INTERNAL_FIELD_VALUE:
+                values = self.format_value(form, field, values)
         if not isinstance(values, (tuple, list)):
             values = (values,)
         attrs = dict(self.attrs)
@@ -551,5 +591,6 @@
             'domid': self.domid, 'href': self.href}
 
 
+# more widgets #################################################################
 
 # XXX EntityLinkComboBoxWidget, [Raw]DynamicComboBoxWidget