]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/widgets/__init__.py
6e8ec966ce71d2e029d554d0f9bd9b865ac9ea62
[bluechips.git] / bluechips / widgets / __init__.py
1 from tw import forms
2
3 from tw.forms import validators
4
5 from bluechips import model
6 from bluechips.model import meta
7
8 from bluechips.model.types import Currency
9
10 class UserSelect(forms.SingleSelectField):
11     @staticmethod
12     def getUserList():
13         for u in meta.Session.query(model.User):
14             yield (u.id, u.name)
15     
16     options = getUserList
17     validator = validators.Wrapper(
18         to_python=(lambda x: meta.Session.query(model.User).get(int(x))),
19         from_python=(lambda x: str(x.id)))
20     
21     def _is_option_selected(self, option_value, value):
22         if value is not None:
23             return option_value == value.id
24         else:
25             return False
26
27 class AmountField(forms.TextField):
28     size = 8
29     validator = validators.All(
30         validators.Wrapper(
31             to_python=(lambda x: Currency(float(x) * 100)),
32             from_python=Currency.__str_no_dollar__),
33         validators.Regex(r'^\-?[0-9]*(\.[0-9]{2})?$'))
34
35 # This is virtually copied from formencode.validator.FieldsMatch, but
36 # I wanted my own version for fields that shouldn't match
37 class FieldsDontMatch(validators.FormValidator):
38     """
39     Tests that the given fields do not match.
40     """
41     
42     show_match = False
43     field_names = None
44     valid_partial_form = True
45     __unpackargs__ = ('*', 'field_names')
46     
47     messages = {
48         'invalid': "Fields match"
49         }
50     
51     def validate_partial(self, field_dict, state):
52         for name in self.field_names:
53             if not field_dict.has_key(name):
54                 return
55         self.validate_python(field_dict, state)
56     
57     def validate_python(self, field_dict, state):
58         errors = {}
59         for ref_index, ref in enumerate(self.field_names):
60             for name in self.field_names[ref_index+1:]:
61                 if field_dict.get(name, '') == field_dict.get(ref, ''):
62                     errors[name] = self.message('invalid', state)
63         if errors:
64             error_list = errors.items()
65             error_list.sort()
66             error_message = '<br>\n'.join(
67                 ['%s: %s' % (name, value) for name, value in error_list])
68             raise validators.Invalid(error_message,
69                                      field_dict, state,
70                                      error_dict=errors)
71
72 __all__ = ['UserSelect', 'AmountField', 'FieldsDontMatch']