diff -r 97774eb6443b -r ea75dfe32317 web/formfields.py --- a/web/formfields.py Wed Apr 22 19:44:15 2009 +0200 +++ b/web/formfields.py Wed Apr 22 20:01:28 2009 +0200 @@ -17,7 +17,7 @@ from cubicweb.web import INTERNAL_FIELD_VALUE from cubicweb.web.formwidgets import ( HiddenInput, TextInput, FileInput, PasswordInput, TextArea, FCKEditor, - Radio, Select, DateTimePicker) + Radio, Select, DateTimePicker) class Field(object): """field class is introduced to control what's displayed in forms. It makes @@ -28,7 +28,7 @@ ---------- all the attributes described below have sensible default value which may be overriden by value given to field's constructor. - + :name: name of the field (basestring), should be unique in a form. :id: @@ -60,7 +60,7 @@ :role: when the field is linked to an entity attribute or relation, tells the role of the entity in the relation (eg 'subject' or 'object') - + """ # default widget associated to this class of fields. May be overriden per # instance @@ -70,7 +70,7 @@ # class attribute used for ordering of fields in a form __creation_rank = 0 - def __init__(self, name=None, id=None, label=None, help=None, + def __init__(self, name=None, id=None, label=None, help=None, widget=None, required=False, initial=None, choices=None, sort=True, internationalizable=False, eidparam=False, role='subject'): @@ -92,7 +92,7 @@ # ordering number for this field instance self.creation_rank = Field.__creation_rank Field.__creation_rank += 1 - + def __unicode__(self): return u'<%s name=%r label=%r id=%r initial=%r @%x>' % ( self.__class__.__name__, self.name, self.label, @@ -109,17 +109,17 @@ self.id = name if not self.label: self.label = name - + def is_visible(self): """return true if the field is not an hidden field""" return not isinstance(self.widget, HiddenInput) - + def actual_fields(self, form): """return actual fields composing this field in case of a compound field, usually simply return self """ yield self - + def format_value(self, req, value): """return value suitable for display where value may be a list or tuple of values @@ -127,7 +127,7 @@ if isinstance(value, (list, tuple)): return [self.format_single_value(req, val) for val in value] return self.format_single_value(req, value) - + def format_single_value(self, req, value): """return value suitable for display""" if value is None or value is False: @@ -139,11 +139,11 @@ def get_widget(self, form): """return the widget instance associated to this field""" return self.widget - + def example_format(self, req): """return a sample string describing what can be given as input for this field - """ + """ return u'' def render(self, form, renderer): @@ -154,7 +154,7 @@ def vocabulary(self, form): """return vocabulary for this field. This method will be called by - widgets which desire it.""" + widgets which desire it.""" if self.choices is not None: if callable(self.choices): vocab = self.choices(req=form.req) @@ -169,13 +169,13 @@ if self.sort: vocab = sorted(vocab) return vocab - + def form_init(self, form): """method called before by form_build_context to trigger potential field initialization requiring the form instance """ pass - + class StringField(Field): def __init__(self, max_length=None, **kwargs): super(StringField, self).__init__(**kwargs) @@ -227,13 +227,13 @@ choices=choices) req.data[self] = field return field - + def actual_fields(self, form): yield self format_field = self.get_format_field(form) if format_field: yield format_field - + def use_fckeditor(self, form): """return True if fckeditor should be used to edit entity's attribute named `attr`, according to user preferences @@ -254,12 +254,12 @@ class FileField(StringField): widget = FileInput needs_multipart = True - + def __init__(self, format_field=None, encoding_field=None, **kwargs): super(FileField, self).__init__(**kwargs) self.format_field = format_field self.encoding_field = encoding_field - + def actual_fields(self, form): yield self if self.format_field: @@ -281,7 +281,7 @@ wdgs.append(self.render_subfield(form, self.format_field, renderer)) if self.encoding_field: wdgs.append(self.render_subfield(form, self.encoding_field, renderer)) - wdgs.append(u'') + wdgs.append(u'') if not self.required and form.context[self]['value']: # trick to be able to delete an uploaded file wdgs.append(u'
') @@ -296,10 +296,10 @@ + renderer.render_help(form, field) + u'
') - + class EditableFileField(FileField): editable_formats = ('text/plain', 'text/html', 'text/rest') - + def render(self, form, renderer): wdgs = [super(EditableFileField, self).render(form, renderer)] if form.form_field_format(self) in self.editable_formats: @@ -326,7 +326,7 @@ # XXX restore form context? return '\n'.join(wdgs) - + class IntField(Field): def __init__(self, min=None, max=None, **kwargs): super(IntField, self).__init__(**kwargs) @@ -335,14 +335,14 @@ class BooleanField(Field): widget = Radio - + def vocabulary(self, form): if self.choices: return self.choices return [(form.req._('yes'), '1'), (form.req._('no'), '')] -class FloatField(IntField): +class FloatField(IntField): def format_single_value(self, req, value): formatstr = req.property_value('ui.float-format') if value is None: @@ -356,7 +356,7 @@ class DateField(StringField): format_prop = 'ui.date-format' widget = DateTimePicker - + def format_single_value(self, req, value): return value and ustrftime(value, req.property_value(self.format_prop)) or u'' @@ -378,8 +378,8 @@ super(HiddenInitialValueField, self).__init__( name=name, widget=HiddenInput, eidparam=True) self.visible_field = visible_field - - + + class RelationField(Field): def __init__(self, **kwargs): super(RelationField, self).__init__(**kwargs) @@ -387,7 +387,7 @@ @staticmethod def fromcardinality(card, **kwargs): return RelationField(widget=Select(multiple=card in '*+'), **kwargs) - + def vocabulary(self, form): entity = form.edited_entity req = entity.req @@ -407,7 +407,7 @@ else: relatedvocab = [] return res + form.form_field_vocabulary(self) + relatedvocab - + def format_single_value(self, req, value): return value