web/formfields.py
changeset 3451 6b46d73823f5
parent 3388 b8be8fc77c27
child 3503 06bced8edddf
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
   193                 try:
   193                 try:
   194                     vocab = self.choices(form=form)
   194                     vocab = self.choices(form=form)
   195                 except TypeError:
   195                 except TypeError:
   196                     warn('vocabulary method (eg field.choices) should now take '
   196                     warn('vocabulary method (eg field.choices) should now take '
   197                          'the form instance as argument', DeprecationWarning)
   197                          'the form instance as argument', DeprecationWarning)
   198                     vocab = self.choices(req=form.req)
   198                     vocab = self.choices(req=form._cw)
   199             else:
   199             else:
   200                 vocab = self.choices
   200                 vocab = self.choices
   201             if vocab and not isinstance(vocab[0], (list, tuple)):
   201             if vocab and not isinstance(vocab[0], (list, tuple)):
   202                 vocab = [(x, x) for x in vocab]
   202                 vocab = [(x, x) for x in vocab]
   203         else:
   203         else:
   204             vocab = form.form_field_vocabulary(self)
   204             vocab = form.form_field_vocabulary(self)
   205         if self.internationalizable:
   205         if self.internationalizable:
   206             vocab = [(form.req._(label), value) for label, value in vocab]
   206             vocab = [(form._cw._(label), value) for label, value in vocab]
   207         if self.sort:
   207         if self.sort:
   208             vocab = vocab_sort(vocab)
   208             vocab = vocab_sort(vocab)
   209         return vocab
   209         return vocab
   210 
   210 
   211     def form_init(self, form):
   211     def form_init(self, form):
   282     def get_format_field(self, form):
   282     def get_format_field(self, form):
   283         if self.format_field:
   283         if self.format_field:
   284             return self.format_field
   284             return self.format_field
   285         # we have to cache generated field since it's use as key in the
   285         # we have to cache generated field since it's use as key in the
   286         # context dictionnary
   286         # context dictionnary
   287         req = form.req
   287         req = form._cw
   288         try:
   288         try:
   289             return req.data[self]
   289             return req.data[self]
   290         except KeyError:
   290         except KeyError:
   291             fkwargs = {'eidparam': self.eidparam}
   291             fkwargs = {'eidparam': self.eidparam}
   292             if self.use_fckeditor(form):
   292             if self.use_fckeditor(form):
   314 
   314 
   315     def use_fckeditor(self, form):
   315     def use_fckeditor(self, form):
   316         """return True if fckeditor should be used to edit entity's attribute named
   316         """return True if fckeditor should be used to edit entity's attribute named
   317         `attr`, according to user preferences
   317         `attr`, according to user preferences
   318         """
   318         """
   319         if form.req.use_fckeditor():
   319         if form._cw.use_fckeditor():
   320             return form.form_field_format(self) == 'text/html'
   320             return form.form_field_format(self) == 'text/html'
   321         return False
   321         return False
   322 
   322 
   323     def render(self, form, renderer):
   323     def render(self, form, renderer):
   324         format_field = self.get_format_field(form)
   324         format_field = self.get_format_field(form)
   352         wdgs = [self.get_widget(form).render(form, self, renderer)]
   352         wdgs = [self.get_widget(form).render(form, self, renderer)]
   353         if self.format_field or self.encoding_field:
   353         if self.format_field or self.encoding_field:
   354             divid = '%s-advanced' % form.context[self]['name']
   354             divid = '%s-advanced' % form.context[self]['name']
   355             wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' %
   355             wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' %
   356                         (xml_escape(uilib.toggle_action(divid)),
   356                         (xml_escape(uilib.toggle_action(divid)),
   357                          form.req._('show advanced fields'),
   357                          form._cw._('show advanced fields'),
   358                          xml_escape(form.req.build_url('data/puce_down.png')),
   358                          xml_escape(form._cw.build_url('data/puce_down.png')),
   359                          form.req._('show advanced fields')))
   359                          form._cw._('show advanced fields')))
   360             wdgs.append(u'<div id="%s" class="hidden">' % divid)
   360             wdgs.append(u'<div id="%s" class="hidden">' % divid)
   361             if self.format_field:
   361             if self.format_field:
   362                 wdgs.append(self.render_subfield(form, self.format_field, renderer))
   362                 wdgs.append(self.render_subfield(form, self.format_field, renderer))
   363             if self.encoding_field:
   363             if self.encoding_field:
   364                 wdgs.append(self.render_subfield(form, self.encoding_field, renderer))
   364                 wdgs.append(self.render_subfield(form, self.encoding_field, renderer))
   366         if not self.required and form.context[self]['value']:
   366         if not self.required and form.context[self]['value']:
   367             # trick to be able to delete an uploaded file
   367             # trick to be able to delete an uploaded file
   368             wdgs.append(u'<br/>')
   368             wdgs.append(u'<br/>')
   369             wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'],
   369             wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'],
   370                                    type=u'checkbox'))
   370                                    type=u'checkbox'))
   371             wdgs.append(form.req._('detach attached file'))
   371             wdgs.append(form._cw._('detach attached file'))
   372         return u'\n'.join(wdgs)
   372         return u'\n'.join(wdgs)
   373 
   373 
   374     def render_subfield(self, form, field, renderer):
   374     def render_subfield(self, form, field, renderer):
   375         return (renderer.render_label(form, field)
   375         return (renderer.render_label(form, field)
   376                 + field.render(form, renderer)
   376                 + field.render(form, renderer)
   377                 + renderer.render_help(form, field)
   377                 + renderer.render_help(form, field)
   378                 + u'<br/>')
   378                 + u'<br/>')
   379 
   379 
   380     def process_form_value(self, form):
   380     def process_form_value(self, form):
   381         posted = form.req.form
   381         posted = form._cw.form
   382         value = posted.get(form.form_field_name(self))
   382         value = posted.get(form.form_field_name(self))
   383         formkey = form.form_field_name(self)
   383         formkey = form.form_field_name(self)
   384         if ('%s__detach' % form.context[self]['name']) in posted:
   384         if ('%s__detach' % form.context[self]['name']) in posted:
   385             # drop current file value
   385             # drop current file value
   386             value = None
   386             value = None
   410                     form.context[self]['value'] = unicode(data.getvalue(), encoding)
   410                     form.context[self]['value'] = unicode(data.getvalue(), encoding)
   411                 except UnicodeError:
   411                 except UnicodeError:
   412                     pass
   412                     pass
   413                 else:
   413                 else:
   414                     if not self.required:
   414                     if not self.required:
   415                         msg = form.req._(
   415                         msg = form._cw._(
   416                             'You can either submit a new file using the browse button above'
   416                             'You can either submit a new file using the browse button above'
   417                             ', or choose to remove already uploaded file by checking the '
   417                             ', or choose to remove already uploaded file by checking the '
   418                             '"detach attached file" check-box, or edit file content online '
   418                             '"detach attached file" check-box, or edit file content online '
   419                             'with the widget below.')
   419                             'with the widget below.')
   420                     else:
   420                     else:
   421                         msg = form.req._(
   421                         msg = form._cw._(
   422                             'You can either submit a new file using the browse button above'
   422                             'You can either submit a new file using the browse button above'
   423                             ', or edit file content online with the widget below.')
   423                             ', or edit file content online with the widget below.')
   424                     wdgs.append(u'<p><b>%s</b></p>' % msg)
   424                     wdgs.append(u'<p><b>%s</b></p>' % msg)
   425                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   425                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   426                     # XXX restore form context?
   426                     # XXX restore form context?
   427         return '\n'.join(wdgs)
   427         return '\n'.join(wdgs)
   428 
   428 
   429     def process_form_value(self, form):
   429     def process_form_value(self, form):
   430         value = form.req.form.get(form.form_field_name(self))
   430         value = form._cw.form.get(form.form_field_name(self))
   431         if isinstance(value, unicode):
   431         if isinstance(value, unicode):
   432             # file modified using a text widget
   432             # file modified using a text widget
   433             encoding = form.form_field_encoding(self)
   433             encoding = form.form_field_encoding(self)
   434             return Binary(value.encode(encoding))
   434             return Binary(value.encode(encoding))
   435         return super(EditableFileField, self).process_form_value(form)
   435         return super(EditableFileField, self).process_form_value(form)
   451     widget = Radio
   451     widget = Radio
   452 
   452 
   453     def vocabulary(self, form):
   453     def vocabulary(self, form):
   454         if self.choices:
   454         if self.choices:
   455             return self.choices
   455             return self.choices
   456         return [(form.req._('yes'), '1'), (form.req._('no'), '')]
   456         return [(form._cw._('yes'), '1'), (form._cw._('no'), '')]
   457 
   457 
   458     def process_form_value(self, form):
   458     def process_form_value(self, form):
   459         return bool(Field.process_form_value(self, form))
   459         return bool(Field.process_form_value(self, form))
   460 
   460 
   461 class FloatField(IntField):
   461 class FloatField(IntField):
   532         kwargs.setdefault('widget', Select(multiple=card in '*+'))
   532         kwargs.setdefault('widget', Select(multiple=card in '*+'))
   533         return RelationField(**kwargs)
   533         return RelationField(**kwargs)
   534 
   534 
   535     def vocabulary(self, form):
   535     def vocabulary(self, form):
   536         entity = form.edited_entity
   536         entity = form.edited_entity
   537         req = entity.req
   537         req = entity._cw
   538         # first see if its specified by __linkto form parameters
   538         # first see if its specified by __linkto form parameters
   539         linkedto = entity.linked_to(self.name, self.role)
   539         linkedto = entity.linked_to(self.name, self.role)
   540         if linkedto:
   540         if linkedto:
   541             entities = (req.entity_from_eid(eid) for eid in linkedto)
   541             entities = (req.entity_from_eid(eid) for eid in linkedto)
   542             return [(entity.view('combobox'), entity.eid) for entity in entities]
   542             return [(entity.view('combobox'), entity.eid) for entity in entities]