web/formfields.py
changeset 4359 fabc680bb0bf
parent 4354 30f745305997
child 4368 d752ad901f14
equal deleted inserted replaced
4358:9a902670e4ff 4359:fabc680bb0bf
   335             return True
   335             return True
   336         return False
   336         return False
   337 
   337 
   338     def process_form_value(self, form):
   338     def process_form_value(self, form):
   339         """process posted form and return correctly typed value"""
   339         """process posted form and return correctly typed value"""
       
   340         try:
       
   341             return form.formvalues[self]
       
   342         except KeyError:
       
   343             value = form.formvalues[self] = self._process_form_value(form)
       
   344             return value
       
   345 
       
   346     def _process_form_value(self, form):
   340         widget = self.get_widget(form)
   347         widget = self.get_widget(form)
   341         return widget.process_field_data(form, self)
   348         return widget.process_field_data(form, self)
   342 
   349 
   343     def process_posted(self, form):
   350     def process_posted(self, form):
   344         for field in self.actual_fields(form):
   351         for field in self.actual_fields(form):
   531         return (renderer.render_label(form, field)
   538         return (renderer.render_label(form, field)
   532                 + field.render(form, renderer)
   539                 + field.render(form, renderer)
   533                 + renderer.render_help(form, field)
   540                 + renderer.render_help(form, field)
   534                 + u'<br/>')
   541                 + u'<br/>')
   535 
   542 
   536     def process_form_value(self, form):
   543     def _process_form_value(self, form):
   537         posted = form._cw.form
   544         posted = form._cw.form
   538         if self.input_name(form, u'__detach') in posted:
   545         if self.input_name(form, u'__detach') in posted:
   539             # drop current file value on explictily asked to detach
   546             # drop current file value on explictily asked to detach
   540             return None
   547             return None
   541         try:
   548         try:
   583                     wdgs.append(u'<p><b>%s</b></p>' % msg)
   590                     wdgs.append(u'<p><b>%s</b></p>' % msg)
   584                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   591                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   585                     # XXX restore form context?
   592                     # XXX restore form context?
   586         return '\n'.join(wdgs)
   593         return '\n'.join(wdgs)
   587 
   594 
   588     def process_form_value(self, form):
   595     def _process_form_value(self, form):
   589         value = form._cw.form.get(self.input_name(form))
   596         value = form._cw.form.get(self.input_name(form))
   590         if isinstance(value, unicode):
   597         if isinstance(value, unicode):
   591             # file modified using a text widget
   598             # file modified using a text widget
   592             return Binary(value.encode(self.encoding(form)))
   599             return Binary(value.encode(self.encoding(form)))
   593         return super(EditableFileField, self).process_form_value(form)
   600         return super(EditableFileField, self)._process_form_value(form)
   594 
   601 
   595 
   602 
   596 class IntField(Field):
   603 class IntField(Field):
   597     def __init__(self, min=None, max=None, **kwargs):
   604     def __init__(self, min=None, max=None, **kwargs):
   598         super(IntField, self).__init__(**kwargs)
   605         super(IntField, self).__init__(**kwargs)
   600         self.max = max
   607         self.max = max
   601         if isinstance(self.widget, TextInput):
   608         if isinstance(self.widget, TextInput):
   602             self.widget.attrs.setdefault('size', 5)
   609             self.widget.attrs.setdefault('size', 5)
   603             self.widget.attrs.setdefault('maxlength', 15)
   610             self.widget.attrs.setdefault('maxlength', 15)
   604 
   611 
   605     def process_form_value(self, form):
   612     def _process_form_value(self, form):
   606         value = Field.process_form_value(self, form)
   613         value = Field._process_form_value(self, form)
   607         if value:
   614         if value:
   608             try:
   615             try:
   609                 return int(value)
   616                 return int(value)
   610             except ValueError:
   617             except ValueError:
   611                 raise ProcessFormError(form._cw._('an integer is expected'))
   618                 raise ProcessFormError(form._cw._('an integer is expected'))
   618     def vocabulary(self, form):
   625     def vocabulary(self, form):
   619         if self.choices:
   626         if self.choices:
   620             return super(BooleanField, self).vocabulary(form)
   627             return super(BooleanField, self).vocabulary(form)
   621         return [(form._cw._('yes'), '1'), (form._cw._('no'), '')]
   628         return [(form._cw._('yes'), '1'), (form._cw._('no'), '')]
   622 
   629 
   623     def process_form_value(self, form):
   630     def _process_form_value(self, form):
   624         return bool(Field.process_form_value(self, form))
   631         return bool(Field._process_form_value(self, form))
   625 
   632 
   626 
   633 
   627 class FloatField(IntField):
   634 class FloatField(IntField):
   628     def format_single_value(self, req, value):
   635     def format_single_value(self, req, value):
   629         formatstr = req.property_value('ui.float-format')
   636         formatstr = req.property_value('ui.float-format')
   632         return formatstr % float(value)
   639         return formatstr % float(value)
   633 
   640 
   634     def render_example(self, req):
   641     def render_example(self, req):
   635         return self.format_single_value(req, 1.234)
   642         return self.format_single_value(req, 1.234)
   636 
   643 
   637     def process_form_value(self, form):
   644     def _process_form_value(self, form):
   638         value = Field.process_form_value(self, form)
   645         value = Field._process_form_value(self, form)
   639         if value:
   646         if value:
   640             try:
   647             try:
   641                 return float(value)
   648                 return float(value)
   642             except ValueError:
   649             except ValueError:
   643                 raise ProcessFormError(form._cw._('a float is expected'))
   650                 raise ProcessFormError(form._cw._('a float is expected'))
   652         return value and ustrftime(value, req.property_value(self.format_prop)) or u''
   659         return value and ustrftime(value, req.property_value(self.format_prop)) or u''
   653 
   660 
   654     def render_example(self, req):
   661     def render_example(self, req):
   655         return self.format_single_value(req, datetime.now())
   662         return self.format_single_value(req, datetime.now())
   656 
   663 
   657     def process_form_value(self, form):
   664     def _process_form_value(self, form):
   658         # widget is supposed to return a date as a correctly formatted string
   665         # widget is supposed to return a date as a correctly formatted string
   659         date = Field.process_form_value(self, form)
   666         date = Field._process_form_value(self, form)
   660         # but for some widgets, it might be simpler to return date objects
   667         # but for some widgets, it might be simpler to return date objects
   661         # directly, so handle that case :
   668         # directly, so handle that case :
   662         if isinstance(date, basestring):
   669         if isinstance(date, basestring):
   663             try:
   670             try:
   664                 date = form._cw.parse_datetime(date, 'Date')
   671                 date = form._cw.parse_datetime(date, 'Date')
   668 
   675 
   669 
   676 
   670 class DateTimeField(DateField):
   677 class DateTimeField(DateField):
   671     format_prop = 'ui.datetime-format'
   678     format_prop = 'ui.datetime-format'
   672 
   679 
   673     def process_form_value(self, form):
   680     def _process_form_value(self, form):
   674         # widget is supposed to return a date as a correctly formatted string
   681         # widget is supposed to return a date as a correctly formatted string
   675         date = Field.process_form_value(self, form)
   682         date = Field._process_form_value(self, form)
   676         # but for some widgets, it might be simpler to return date objects
   683         # but for some widgets, it might be simpler to return date objects
   677         # directly, so handle that case :
   684         # directly, so handle that case :
   678         if isinstance(date, basestring):
   685         if isinstance(date, basestring):
   679             try:
   686             try:
   680                 date = form._cw.parse_datetime(date, 'Datetime')
   687                 date = form._cw.parse_datetime(date, 'Datetime')
   685 
   692 
   686 class TimeField(DateField):
   693 class TimeField(DateField):
   687     format_prop = 'ui.time-format'
   694     format_prop = 'ui.time-format'
   688     widget = TextInput
   695     widget = TextInput
   689 
   696 
   690     def process_form_value(self, form):
   697     def _process_form_value(self, form):
   691         # widget is supposed to return a date as a correctly formatted string
   698         # widget is supposed to return a date as a correctly formatted string
   692         time = Field.process_form_value(self, form)
   699         time = Field._process_form_value(self, form)
   693         # but for some widgets, it might be simpler to return time objects
   700         # but for some widgets, it might be simpler to return time objects
   694         # directly, so handle that case :
   701         # directly, so handle that case :
   695         if isinstance(time, basestring):
   702         if isinstance(time, basestring):
   696             try:
   703             try:
   697                 time = form._cw.parse_datetime(time, 'Time')
   704                 time = form._cw.parse_datetime(time, 'Time')
   799         return ()
   806         return ()
   800 
   807 
   801     def format_single_value(self, req, value):
   808     def format_single_value(self, req, value):
   802         return value
   809         return value
   803 
   810 
   804     def process_form_value(self, form):
   811     def _process_form_value(self, form):
   805         """process posted form and return correctly typed value"""
   812         """process posted form and return correctly typed value"""
   806         widget = self.get_widget(form)
   813         widget = self.get_widget(form)
   807         values = widget.process_field_data(form, self)
   814         values = widget.process_field_data(form, self)
   808         if values is None:
   815         if values is None:
   809             values = ()
   816             values = ()