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 = () |