Ignore:
Timestamp:
4 Jun 2011, 12:23:23 (13 years ago)
Author:
uli
Message:

Add extended bools widget. This one accepts also '1', 'true', 'yes' as True values, which is handy when importing CSV
files. We have to register this new widget overriding the default. Maybe a bit overkill?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.sirp/trunk/src/waeup/sirp/utils/converters.py

    r6276 r6278  
    44from zope.component import createObject
    55from zope.formlib import form
     6from zope.formlib.boolwidgets import CheckBoxWidget
    67from zope.formlib.form import (
    78    _widgetKey, WidgetInputError, ValidationError, InputErrors, expandPrefix)
    8 from zope.formlib.interfaces import IInputWidget
     9from zope.formlib.interfaces import IInputWidget, ISimpleInputWidget
    910from zope.interface import Interface
    1011from zope.publisher.browser import TestRequest
    1112from waeup.sirp.interfaces import IObjectConverter
     13
     14class ExtendedCheckBoxWidget(CheckBoxWidget):
     15    """A checkbox widget that supports more input values as True/False
     16       markers.
     17
     18    The default bool widget expects the string 'on' as only valid
     19    ``True`` value in HTML forms for bool fields.
     20
     21    This widget also accepts '1', 'true' and 'yes' for that. Also all
     22    uppercase/lowecase combinations of these strings are accepted.
     23
     24    The widget still renders ``True`` to ``'on'`` when a form is
     25    generated.
     26    """
     27    true_markers = ['1', 'true', 'on', 'yes']
     28
     29    def _toFieldValue(self, input):
     30        """Convert from HTML presentation to Python bool."""
     31        if not isinstance(input, basestring):
     32            return False
     33        return input.lower() in self.true_markers
     34
     35    def _getFormInput(self):
     36        """Returns the form input used by `_toFieldValue`.
     37
     38        Return values:
     39
     40          ``'on'``  checkbox is checked
     41          ``''``    checkbox is not checked
     42          ``None``  form input was not provided
     43
     44        """
     45        value = self.request.get(self.name)
     46        if isinstance(value, basestring):
     47            value = value.lower()
     48        if value in self.true_markers:
     49            return 'on'
     50        elif self.name + '.used' in self.request:
     51            return ''
     52        else:
     53            return None
    1254
    1355def getWidgetsData(widgets, form_prefix, data):
     
    4890
    4991    return errors
     92
    5093
    5194class DefaultObjectConverter(grok.Adapter):
Note: See TracChangeset for help on using the changeset viewer.