cubicweb/web/formfields.py
changeset 12567 26744ad37953
parent 12348 6bcdd7278f7f
equal deleted inserted replaced
12566:6b3523f81f42 12567:26744ad37953
    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)]