3 from tw.forms import validators
5 from bluechips import model
6 from bluechips.model import meta
8 from bluechips.lib.base import _
10 from decimal import Decimal
12 class UserSelect(forms.SingleSelectField):
15 for u in meta.Session.query(model.User):
19 validator = validators.Wrapper(
20 to_python=(lambda x: meta.Session.query(model.User).get(int(x))),
21 from_python=(lambda x: str(x.id)))
23 def _is_option_selected(self, option_value, value):
25 return option_value == value.id
29 class AmountField(forms.TextField):
31 validator = validators.All(
35 validators.Regex(r'^[0-9]*(\.[0-9]{2})?$', not_empty=True))
37 # This is virtually copied from formencode.validator.FieldsMatch, but
38 # I wanted my own version for fields that shouldn't match
39 class FieldsDontMatch(validators.FormValidator):
41 Tests that the given fields do not match.
46 valid_partial_form = True
47 __unpackargs__ = ('*', 'field_names')
50 'invalid': _("Fields match")
53 def validate_partial(self, field_dict, state):
54 for name in self.field_names:
55 if not field_dict.has_key(name):
57 self.validate_python(field_dict, state)
59 def validate_python(self, field_dict, state):
61 for ref_index, ref in enumerate(self.field_names):
62 for name in self.field_names[ref_index+1:]:
63 if field_dict.get(name, '') == field_dict.get(ref, ''):
64 errors[name] = self.message('invalid', state)
66 error_list = errors.items()
68 error_message = '<br>\n'.join(
69 ['%s: %s' % (name, value) for name, value in error_list])
70 raise validators.Invalid(error_message,
74 __all__ = ['UserSelect', 'AmountField', 'FieldsDontMatch']