web/formfields.py
changeset 4156 1bbb0ee42c8e
parent 4110 8728d8c95985
child 4158 0e97cf2cf55b
equal deleted inserted replaced
4155:80cc9c6ddcf0 4156:1bbb0ee42c8e
   168 
   168 
   169     def get_widget(self, form):
   169     def get_widget(self, form):
   170         """return the widget instance associated to this field"""
   170         """return the widget instance associated to this field"""
   171         return self.widget
   171         return self.widget
   172 
   172 
       
   173     # cached is necessary else we get some pb on entity creation : entity.eid is
       
   174     # modified from creation mark (eg 'X') to its actual eid (eg 123), and then
       
   175     # `field.input_name()` won't return the right key anymore if not cached
       
   176     # (first call to input_name done *before* eventual eid affectation).
       
   177     @cached
       
   178     def input_name(self, form, suffix=None):
       
   179         """return 'qualified name' for this field"""
       
   180         if self.eidparam:
       
   181             if suffix is None:
       
   182                 return eid_param(self.role_name(), form.edited_entity.eid)
       
   183             return eid_param(self.role_name() + suffix, form.edited_entity.eid)
       
   184         if suffix is None:
       
   185             return self.name
       
   186         return self.name + suffix
       
   187 
       
   188     def role_name(self):
       
   189         """return <field.name>-<field.role> if role is specified, else field.name"""
       
   190         if self.role is not None:
       
   191             return '%s-%s' % (self.name, self.role)
       
   192         return self.name
       
   193 
       
   194     def dom_id(self, form):
       
   195         """return an html dom identifier for this field"""
       
   196         id = self.id or self.role_name()
       
   197         if self.eidparam:
       
   198             return eid_param(id, form.edited_entity.eid)
       
   199         return id
       
   200 
   173     def example_format(self, req):
   201     def example_format(self, req):
   174         """return a sample string describing what can be given as input for this
   202         """return a sample string describing what can be given as input for this
   175         field
   203         field
   176         """
   204         """
   177         return u''
   205         return u''
   354             yield self.name_field
   382             yield self.name_field
   355 
   383 
   356     def render(self, form, renderer):
   384     def render(self, form, renderer):
   357         wdgs = [self.get_widget(form).render(form, self, renderer)]
   385         wdgs = [self.get_widget(form).render(form, self, renderer)]
   358         if self.format_field or self.encoding_field:
   386         if self.format_field or self.encoding_field:
   359             divid = '%s-advanced' % form.context[self]['name']
   387             divid = '%s-advanced' % self.input_name(form)
   360             wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' %
   388             wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' %
   361                         (xml_escape(uilib.toggle_action(divid)),
   389                         (xml_escape(uilib.toggle_action(divid)),
   362                          form._cw._('show advanced fields'),
   390                          form._cw._('show advanced fields'),
   363                          xml_escape(form._cw.build_url('data/puce_down.png')),
   391                          xml_escape(form._cw.build_url('data/puce_down.png')),
   364                          form._cw._('show advanced fields')))
   392                          form._cw._('show advanced fields')))
   371                 wdgs.append(self.render_subfield(form, self.encoding_field, renderer))
   399                 wdgs.append(self.render_subfield(form, self.encoding_field, renderer))
   372             wdgs.append(u'</div>')
   400             wdgs.append(u'</div>')
   373         if not self.required and form.context[self]['value']:
   401         if not self.required and form.context[self]['value']:
   374             # trick to be able to delete an uploaded file
   402             # trick to be able to delete an uploaded file
   375             wdgs.append(u'<br/>')
   403             wdgs.append(u'<br/>')
   376             wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'],
   404             wdgs.append(tags.input(name=self.input_name(form, u'__detach'),
   377                                    type=u'checkbox'))
   405                                    type=u'checkbox'))
   378             wdgs.append(form._cw._('detach attached file'))
   406             wdgs.append(form._cw._('detach attached file'))
   379         return u'\n'.join(wdgs)
   407         return u'\n'.join(wdgs)
   380 
   408 
   381     def render_subfield(self, form, field, renderer):
   409     def render_subfield(self, form, field, renderer):
   384                 + renderer.render_help(form, field)
   412                 + renderer.render_help(form, field)
   385                 + u'<br/>')
   413                 + u'<br/>')
   386 
   414 
   387     def process_form_value(self, form):
   415     def process_form_value(self, form):
   388         posted = form._cw.form
   416         posted = form._cw.form
   389         value = posted.get(form.form_field_name(self))
   417         if self.input_name(form, u'__detach') in posted:
   390         formkey = form.form_field_name(self)
       
   391         if ('%s__detach' % form.context[self]['name']) in posted:
       
   392             # drop current file value
   418             # drop current file value
   393             value = None
   419             value = None
       
   420         else:
       
   421             value = posted.get(self.input_name(form))
   394         # no need to check value when nor explicit detach nor new file
   422         # no need to check value when nor explicit detach nor new file
   395         # submitted, since it will think the attribute is not modified
   423         # submitted, since it will think the attribute is not modified
   396         elif value:
   424         elif value:
   397             filename, _, stream = value
   425             filename, _, stream = value
   398             # value is a  3-uple (filename, mimetype, stream)
   426             # value is a  3-uple (filename, mimetype, stream)
   432                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   460                     wdgs.append(TextArea(setdomid=False).render(form, self, renderer))
   433                     # XXX restore form context?
   461                     # XXX restore form context?
   434         return '\n'.join(wdgs)
   462         return '\n'.join(wdgs)
   435 
   463 
   436     def process_form_value(self, form):
   464     def process_form_value(self, form):
   437         value = form._cw.form.get(form.form_field_name(self))
   465         value = form._cw.form.get(self.input_name(form))
   438         if isinstance(value, unicode):
   466         if isinstance(value, unicode):
   439             # file modified using a text widget
   467             # file modified using a text widget
   440             encoding = form.form_field_encoding(self)
   468             encoding = form.form_field_encoding(self)
   441             return Binary(value.encode(encoding))
   469             return Binary(value.encode(encoding))
   442         return super(EditableFileField, self).process_form_value(form)
   470         return super(EditableFileField, self).process_form_value(form)