web/formwidgets.py
changeset 4304 0b53e850cdb5
parent 4252 6c4f109c2b03
child 4305 3d731478d9a8
equal deleted inserted replaced
4303:35e814dce815 4304:0b53e850cdb5
    49         """render the widget for the given `field` of `form`.
    49         """render the widget for the given `field` of `form`.
    50         To override in concrete class
    50         To override in concrete class
    51         """
    51         """
    52         raise NotImplementedError
    52         raise NotImplementedError
    53 
    53 
       
    54     def typed_value(self, form, field):
       
    55         """return field's *typed* value specified in:
       
    56         3. extra form values given to render()
       
    57         4. field's typed value
       
    58         """
       
    59         qname = field.input_name(form)
       
    60         for key in (field, qname):
       
    61             try:
       
    62                 return form.formvalues[key]
       
    63             except KeyError:
       
    64                 continue
       
    65         if field.name != qname and field.name in form.formvalues:
       
    66             return form.formvalues[field.name]
       
    67         return field.typed_value(form)
       
    68 
       
    69     def format_value(self, form, field, value):
       
    70         return field.format_value(form._cw, value)
       
    71 
    54     def values_and_attributes(self, form, field):
    72     def values_and_attributes(self, form, field):
    55         values = field.display_value(form)
    73         """found field's *string* value in:
       
    74         1. previously submitted form values if any (eg on validation error)
       
    75         2. req.form
       
    76         3. extra form values given to render()
       
    77         4. field's typed value
       
    78 
       
    79         values found in 1. and 2. are expected te be already some 'display'
       
    80         value while those found in 3. and 4. are expected to be correctly typed.
       
    81 
       
    82         3 and 4 are handle by the .typed_value(form, field) method
       
    83         """
       
    84         qname = field.input_name(form)
       
    85         if qname in form.form_previous_values:
       
    86             values = form.form_previous_values[qname]
       
    87         elif qname in form._cw.form:
       
    88             values = form._cw.form[qname]
       
    89         elif field.name != qname and field.name in form._cw.form:
       
    90             # compat: accept attr=value in req.form to specify value of attr-subject
       
    91             values = form._cw.form[field.name]
       
    92         else:
       
    93             values = self.typed_value(form, field)
       
    94             if values != INTERNAL_FIELD_VALUE:
       
    95                 values = self.format_value(form, field, values)
    56         if not isinstance(values, (tuple, list)):
    96         if not isinstance(values, (tuple, list)):
    57             values = (values,)
    97             values = (values,)
    58         attrs = dict(self.attrs)
    98         attrs = dict(self.attrs)
    59         if self.setdomid:
    99         if self.setdomid:
    60             attrs['id'] = field.dom_id(form)
   100             attrs['id'] = field.dom_id(form)
   549                '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % {
   589                '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % {
   550             'label': label, 'imgsrc': imgsrc,
   590             'label': label, 'imgsrc': imgsrc,
   551             'domid': self.domid, 'href': self.href}
   591             'domid': self.domid, 'href': self.href}
   552 
   592 
   553 
   593 
       
   594 # more widgets #################################################################
   554 
   595 
   555 # XXX EntityLinkComboBoxWidget, [Raw]DynamicComboBoxWidget
   596 # XXX EntityLinkComboBoxWidget, [Raw]DynamicComboBoxWidget