diff -r 35e814dce815 -r 0b53e850cdb5 web/formwidgets.py --- 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