65 |
65 |
66 |
66 |
67 from datetime import datetime, timedelta |
67 from datetime import datetime, timedelta |
68 |
68 |
69 import pytz |
69 import pytz |
70 |
|
71 from six import PY2, text_type, string_types |
|
72 |
70 |
73 from logilab.mtconverter import xml_escape |
71 from logilab.mtconverter import xml_escape |
74 from logilab.common import nullobject |
72 from logilab.common import nullobject |
75 from logilab.common.date import ustrftime |
73 from logilab.common.date import ustrftime |
76 from logilab.common.configuration import format_time |
74 from logilab.common.configuration import format_time |
234 l.append('%s=%r' % (attr, value)) |
232 l.append('%s=%r' % (attr, value)) |
235 if repr: |
233 if repr: |
236 l.append('@%#x' % id(self)) |
234 l.append('@%#x' % id(self)) |
237 return u'%s>' % ' '.join(l) |
235 return u'%s>' % ' '.join(l) |
238 |
236 |
239 def __unicode__(self): |
237 def __str__(self): |
240 return self.as_string(False) |
238 return self.as_string(False) |
241 |
|
242 if PY2: |
|
243 def __str__(self): |
|
244 return self.as_string(False).encode('UTF8') |
|
245 else: |
|
246 __str__ = __unicode__ |
|
247 |
239 |
248 def __repr__(self): |
240 def __repr__(self): |
249 return self.as_string(True) |
241 return self.as_string(True) |
250 |
242 |
251 def init_widget(self, widget): |
243 def init_widget(self, widget): |
288 """return value suitable for display""" |
280 """return value suitable for display""" |
289 if value is None or value is False: |
281 if value is None or value is False: |
290 return u'' |
282 return u'' |
291 if value is True: |
283 if value is True: |
292 return u'1' |
284 return u'1' |
293 return text_type(value) |
285 return str(value) |
294 |
286 |
295 def get_widget(self, form): |
287 def get_widget(self, form): |
296 """return the widget instance associated to this field""" |
288 """return the widget instance associated to this field""" |
297 return self.widget |
289 return self.widget |
298 |
290 |
823 # XXX restore form context? |
815 # XXX restore form context? |
824 return '\n'.join(wdgs) |
816 return '\n'.join(wdgs) |
825 |
817 |
826 def _process_form_value(self, form): |
818 def _process_form_value(self, form): |
827 value = form._cw.form.get(self.input_name(form)) |
819 value = form._cw.form.get(self.input_name(form)) |
828 if isinstance(value, text_type): |
820 if isinstance(value, str): |
829 # file modified using a text widget |
821 # file modified using a text widget |
830 return Binary(value.encode(self.encoding(form))) |
822 return Binary(value.encode(self.encoding(form))) |
831 return super(EditableFileField, self)._process_form_value(form) |
823 return super(EditableFileField, self)._process_form_value(form) |
832 |
824 |
833 |
825 |
850 super(BigIntField, self).init_widget(widget) |
842 super(BigIntField, self).init_widget(widget) |
851 if isinstance(self.widget, fw.TextInput): |
843 if isinstance(self.widget, fw.TextInput): |
852 self.widget.attrs.setdefault('size', self.default_text_input_size) |
844 self.widget.attrs.setdefault('size', self.default_text_input_size) |
853 |
845 |
854 def _ensure_correctly_typed(self, form, value): |
846 def _ensure_correctly_typed(self, form, value): |
855 if isinstance(value, string_types): |
847 if isinstance(value, str): |
856 value = value.strip() |
848 value = value.strip() |
857 if not value: |
849 if not value: |
858 return None |
850 return None |
859 try: |
851 try: |
860 return int(value) |
852 return int(value) |
932 |
924 |
933 def render_example(self, req): |
925 def render_example(self, req): |
934 return self.format_single_value(req, 1.234) |
926 return self.format_single_value(req, 1.234) |
935 |
927 |
936 def _ensure_correctly_typed(self, form, value): |
928 def _ensure_correctly_typed(self, form, value): |
937 if isinstance(value, string_types): |
929 if isinstance(value, str): |
938 value = value.strip() |
930 value = value.strip() |
939 if not value: |
931 if not value: |
940 return None |
932 return None |
941 try: |
933 try: |
942 return float(value) |
934 return float(value) |
953 """ |
945 """ |
954 widget = fw.TextInput |
946 widget = fw.TextInput |
955 |
947 |
956 def format_single_value(self, req, value): |
948 def format_single_value(self, req, value): |
957 if value: |
949 if value: |
958 value = format_time(value.days * 24 * 3600 + value.seconds) |
950 return format_time(value.days * 24 * 3600 + value.seconds) |
959 return text_type(value) |
|
960 return u'' |
951 return u'' |
961 |
952 |
962 def example_format(self, req): |
953 def example_format(self, req): |
963 """return a sample string describing what can be given as input for this |
954 """return a sample string describing what can be given as input for this |
964 field |
955 field |
965 """ |
956 """ |
966 return u'20s, 10min, 24h, 4d' |
957 return u'20s, 10min, 24h, 4d' |
967 |
958 |
968 def _ensure_correctly_typed(self, form, value): |
959 def _ensure_correctly_typed(self, form, value): |
969 if isinstance(value, string_types): |
960 if isinstance(value, str): |
970 value = value.strip() |
961 value = value.strip() |
971 if not value: |
962 if not value: |
972 return None |
963 return None |
973 try: |
964 try: |
974 value = apply_units(value, TIME_UNITS) |
965 value = apply_units(value, TIME_UNITS) |
994 |
985 |
995 def render_example(self, req): |
986 def render_example(self, req): |
996 return self.format_single_value(req, datetime.now()) |
987 return self.format_single_value(req, datetime.now()) |
997 |
988 |
998 def _ensure_correctly_typed(self, form, value): |
989 def _ensure_correctly_typed(self, form, value): |
999 if isinstance(value, string_types): |
990 if isinstance(value, str): |
1000 value = value.strip() |
991 value = value.strip() |
1001 if not value: |
992 if not value: |
1002 return None |
993 return None |
1003 try: |
994 try: |
1004 value = form._cw.parse_datetime(value, self.etype) |
995 value = form._cw.parse_datetime(value, self.etype) |
1005 except ValueError as ex: |
996 except ValueError as ex: |
1006 raise ProcessFormError(text_type(ex)) |
997 raise ProcessFormError(str(ex)) |
1007 return value |
998 return value |
1008 |
999 |
1009 |
1000 |
1010 class DateTimeField(DateField): |
1001 class DateTimeField(DateField): |
1011 """Use this field to edit datetime (`Datetime` yams type). |
1002 """Use this field to edit datetime (`Datetime` yams type). |
1105 |
1096 |
1106 def relvoc_linkedto(self, form): |
1097 def relvoc_linkedto(self, form): |
1107 linkedto = form.linked_to.get((self.name, self.role)) |
1098 linkedto = form.linked_to.get((self.name, self.role)) |
1108 if linkedto: |
1099 if linkedto: |
1109 buildent = form._cw.entity_from_eid |
1100 buildent = form._cw.entity_from_eid |
1110 return [(buildent(eid).view('combobox'), text_type(eid)) |
1101 return [(buildent(eid).view('combobox'), str(eid)) |
1111 for eid in linkedto] |
1102 for eid in linkedto] |
1112 return [] |
1103 return [] |
1113 |
1104 |
1114 def relvoc_init(self, form): |
1105 def relvoc_init(self, form): |
1115 entity, rtype, role = form.edited_entity, self.name, self.role |
1106 entity, rtype, role = form.edited_entity, self.name, self.role |
1117 if not self.required: |
1108 if not self.required: |
1118 vocab.append(('', INTERNAL_FIELD_VALUE)) |
1109 vocab.append(('', INTERNAL_FIELD_VALUE)) |
1119 # vocabulary doesn't include current values, add them |
1110 # vocabulary doesn't include current values, add them |
1120 if form.edited_entity.has_eid(): |
1111 if form.edited_entity.has_eid(): |
1121 rset = form.edited_entity.related(self.name, self.role) |
1112 rset = form.edited_entity.related(self.name, self.role) |
1122 vocab += [(e.view('combobox'), text_type(e.eid)) |
1113 vocab += [(e.view('combobox'), str(e.eid)) |
1123 for e in rset.entities()] |
1114 for e in rset.entities()] |
1124 return vocab |
1115 return vocab |
1125 |
1116 |
1126 def relvoc_unrelated(self, form, limit=None): |
1117 def relvoc_unrelated(self, form, limit=None): |
1127 entity = form.edited_entity |
1118 entity = form.edited_entity |
1151 for entity in entity.unrelated(self.name, targettype, self.role, limit, |
1142 for entity in entity.unrelated(self.name, targettype, self.role, limit, |
1152 lt_infos=form.linked_to).entities(): |
1143 lt_infos=form.linked_to).entities(): |
1153 if entity.eid in done: |
1144 if entity.eid in done: |
1154 continue |
1145 continue |
1155 done.add(entity.eid) |
1146 done.add(entity.eid) |
1156 res.append((entity.view('combobox'), text_type(entity.eid))) |
1147 res.append((entity.view('combobox'), str(entity.eid))) |
1157 return res |
1148 return res |
1158 |
1149 |
1159 def format_single_value(self, req, value): |
1150 def format_single_value(self, req, value): |
1160 return text_type(value) |
1151 return str(value) |
1161 |
1152 |
1162 def process_form_value(self, form): |
1153 def process_form_value(self, form): |
1163 """process posted form and return correctly typed value""" |
1154 """process posted form and return correctly typed value""" |
1164 try: |
1155 try: |
1165 return form.formvalues[(self, form)] |
1156 return form.formvalues[(self, form)] |