# HG changeset patch # User Sylvain Thénault # Date 1243528332 -7200 # Node ID 96c0e56cb0cfc5e82d604a6f5b28ab0bc9a60068 # Parent 9c1db4e06095e4f3c0ecae6641a9929de8fca3a2 move widget selection's logic on fields diff -r 9c1db4e06095 -r 96c0e56cb0cf web/formfields.py --- a/web/formfields.py Thu May 28 18:31:14 2009 +0200 +++ b/web/formfields.py Thu May 28 18:32:12 2009 +0200 @@ -20,6 +20,7 @@ HiddenInput, TextInput, FileInput, PasswordInput, TextArea, FCKEditor, Radio, Select, DateTimePicker) + class Field(object): """field class is introduced to control what's displayed in forms. It makes the link between something to edit and its display in the form. Actual @@ -80,16 +81,13 @@ self.label = label or name self.help = help self.required = required - if widget is not None: - self.widget = widget - if isinstance(self.widget, type): - self.widget = self.widget() self.initial = initial self.choices = choices self.sort = sort self.internationalizable = internationalizable self.eidparam = eidparam self.role = role + self.init_widget(widget) # ordering number for this field instance self.creation_rank = Field.__creation_rank Field.__creation_rank += 1 @@ -102,6 +100,12 @@ def __repr__(self): return self.__unicode__().encode('utf-8') + def init_widget(self, widget): + if widget is not None: + self.widget = widget + if isinstance(self.widget, type): + self.widget = self.widget() + def set_name(self, name): """automatically set .id and .label when name is set""" assert name @@ -177,12 +181,25 @@ """ pass + class StringField(Field): + widget = TextArea + def __init__(self, max_length=None, **kwargs): + self.max_length = max_length # must be set before super call super(StringField, self).__init__(**kwargs) - self.max_length = max_length + + def init_widget(self, widget): + if widget is None: + if self.choices: + self.widget = Select() + elif self.max_length and self.max_length < 257: + self.widget = TextInput() + super(StringField, self).init_widget(widget) if isinstance(self.widget, TextArea): self.init_text_area(self.widget) + elif isinstance(self.widget, Select): + self.widget.attrs.setdefault('size', 1) def init_text_area(self, widget): if self.max_length < 513: @@ -342,6 +359,7 @@ self.widget.attrs.setdefault('size', 5) self.widget.attrs.setdefault('maxlength', 15) + class BooleanField(Field): widget = Radio @@ -381,6 +399,7 @@ format_prop = 'ui.datetime-format' widget = TextInput + class HiddenInitialValueField(Field): def __init__(self, visible_field): name = 'edit%s-%s' % (visible_field.role[0], visible_field.name) @@ -470,18 +489,11 @@ # init StringField parameters according to constraints for cstr in constraints: if isinstance(cstr, StaticVocabularyConstraint): - kwargs.setdefault('widget', Select()) kwargs.setdefault('choices', cstr.vocabulary) - if card in '?1': - if isinstance(kwargs['widget'], type): - kwargs['widget'] = kwargs['widget']() - kwargs['widget'].attrs.setdefault('size', 1) + break for cstr in constraints: if isinstance(cstr, SizeConstraint) and cstr.max is not None: - if cstr.max < 257: - kwargs.setdefault('widget', TextInput()) kwargs['max_length'] = cstr.max - kwargs.setdefault('widget', TextArea()) return StringField(**kwargs) if fieldclass is FileField: for metadata in ('format', 'encoding'): @@ -493,6 +505,7 @@ kwargs['role'] = role return RelationField.fromcardinality(card, **kwargs) + FIELDS = { 'Boolean': BooleanField, 'Bytes': FileField,