web/views/formrenderers.py
changeset 3451 6b46d73823f5
parent 3398 d84b0176452c
child 3467 a6405235aac6
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
    71         form.add_media()
    71         form.add_media()
    72         data = []
    72         data = []
    73         w = data.append
    73         w = data.append
    74         w(self.open_form(form, values))
    74         w(self.open_form(form, values))
    75         if self.display_progress_div:
    75         if self.display_progress_div:
    76             w(u'<div id="progress">%s</div>' % self.req._('validating...'))
    76             w(u'<div id="progress">%s</div>' % self._cw._('validating...'))
    77         w(u'<fieldset>')
    77         w(u'<fieldset>')
    78         w(tags.input(type=u'hidden', name=u'__form_id',
    78         w(tags.input(type=u'hidden', name=u'__form_id',
    79                      value=values.get('formvid', form.id)))
    79                      value=values.get('formvid', form.__regid__)))
    80         if form.redirect_path:
    80         if form.redirect_path:
    81             w(tags.input(type='hidden', name='__redirectpath', value=form.redirect_path))
    81             w(tags.input(type='hidden', name='__redirectpath', value=form.redirect_path))
    82         self.render_fields(w, form, values)
    82         self.render_fields(w, form, values)
    83         self.render_buttons(w, form)
    83         self.render_buttons(w, form)
    84         w(u'</fieldset>')
    84         w(u'</fieldset>')
    90 
    90 
    91     def render_label(self, form, field):
    91     def render_label(self, form, field):
    92         if field.label is None:
    92         if field.label is None:
    93             return u''
    93             return u''
    94         if isinstance(field.label, tuple): # i.e. needs contextual translation
    94         if isinstance(field.label, tuple): # i.e. needs contextual translation
    95             label = self.req.pgettext(*field.label)
    95             label = self._cw.pgettext(*field.label)
    96         else:
    96         else:
    97             label = self.req._(field.label)
    97             label = self._cw._(field.label)
    98         attrs = {'for': form.context[field]['id']}
    98         attrs = {'for': form.context[field]['id']}
    99         if field.required:
    99         if field.required:
   100             attrs['class'] = 'required'
   100             attrs['class'] = 'required'
   101         return tags.label(label, **attrs)
   101         return tags.label(label, **attrs)
   102 
   102 
   104         help = []
   104         help = []
   105         descr = field.help
   105         descr = field.help
   106         if callable(descr):
   106         if callable(descr):
   107             descr = descr(form)
   107             descr = descr(form)
   108         if descr:
   108         if descr:
   109             help.append('<div class="helper">%s</div>' % self.req._(descr))
   109             help.append('<div class="helper">%s</div>' % self._cw._(descr))
   110         example = field.example_format(self.req)
   110         example = field.example_format(self._cw)
   111         if example:
   111         if example:
   112             help.append('<div class="helper">(%s: %s)</div>'
   112             help.append('<div class="helper">(%s: %s)</div>'
   113                         % (self.req._('sample format'), example))
   113                         % (self._cw._('sample format'), example))
   114         return u'&#160;'.join(help)
   114         return u'&#160;'.join(help)
   115 
   115 
   116     # specific methods (mostly to ease overriding) #############################
   116     # specific methods (mostly to ease overriding) #############################
   117 
   117 
   118     def error_message(self, form):
   118     def error_message(self, form):
   119         """return formatted error message
   119         """return formatted error message
   120 
   120 
   121         This method should be called once inlined field errors has been consumed
   121         This method should be called once inlined field errors has been consumed
   122         """
   122         """
   123         req = self.req
   123         req = self._cw
   124         errex = form.form_valerror
   124         errex = form.form_valerror
   125         # get extra errors
   125         # get extra errors
   126         if errex is not None:
   126         if errex is not None:
   127             errormsg = req._('please correct the following errors:')
   127             errormsg = req._('please correct the following errors:')
   128             displayed = form.form_displayed_errors
   128             displayed = form.form_displayed_errors
   147         if form.form_needs_multipart:
   147         if form.form_needs_multipart:
   148             enctype = 'multipart/form-data'
   148             enctype = 'multipart/form-data'
   149         else:
   149         else:
   150             enctype = 'application/x-www-form-urlencoded'
   150             enctype = 'application/x-www-form-urlencoded'
   151         if form.action is None:
   151         if form.action is None:
   152             action = self.req.build_url('edit')
   152             action = self._cw.build_url('edit')
   153         else:
   153         else:
   154             action = form.action
   154             action = form.action
   155         tag = ('<form action="%s" method="post" enctype="%s"' % (
   155         tag = ('<form action="%s" method="post" enctype="%s"' % (
   156             xml_escape(action or '#'), enctype))
   156             xml_escape(action or '#'), enctype))
   157         if form.domid:
   157         if form.domid:
   208             except KeyError:
   208             except KeyError:
   209                 self.warning('no such fieldset: %s (%s)', fieldset, form)
   209                 self.warning('no such fieldset: %s (%s)', fieldset, form)
   210                 continue
   210                 continue
   211             w(u'<fieldset class="%s">' % (fieldset or u'default'))
   211             w(u'<fieldset class="%s">' % (fieldset or u'default'))
   212             if fieldset:
   212             if fieldset:
   213                 w(u'<legend>%s</legend>' % self.req._(fieldset))
   213                 w(u'<legend>%s</legend>' % self._cw._(fieldset))
   214             w(u'<table class="%s">' % self.table_class)
   214             w(u'<table class="%s">' % self.table_class)
   215             for field in fields:
   215             for field in fields:
   216                 w(u'<tr class="%s_%s_row">' % (field.name, field.role))
   216                 w(u'<tr class="%s_%s_row">' % (field.name, field.role))
   217                 if self.display_label:
   217                 if self.display_label:
   218                     w(u'<th class="labelCol">%s</th>' % self.render_label(form, field))
   218                     w(u'<th class="labelCol">%s</th>' % self.render_label(form, field))
   320             if subfields:
   320             if subfields:
   321                 # main form, display table headers
   321                 # main form, display table headers
   322                 w(u'<tr class="header">')
   322                 w(u'<tr class="header">')
   323                 w(u'<th align="left">%s</th>' %
   323                 w(u'<th align="left">%s</th>' %
   324                   tags.input(type='checkbox',
   324                   tags.input(type='checkbox',
   325                              title=self.req._('toggle check boxes'),
   325                              title=self._cw._('toggle check boxes'),
   326                              onclick="setCheckboxesState('eid', this.checked)"))
   326                              onclick="setCheckboxesState('eid', this.checked)"))
   327                 for field in subfields:
   327                 for field in subfields:
   328                     w(u'<th>%s</th>' % self.req._(field.label))
   328                     w(u'<th>%s</th>' % self._cw._(field.label))
   329                 w(u'</tr>')
   329                 w(u'</tr>')
   330         super(EntityCompositeFormRenderer, self).render_fields(w, form, values)
   330         super(EntityCompositeFormRenderer, self).render_fields(w, form, values)
   331         if not form.is_subform:
   331         if not form.is_subform:
   332             w(u'</table>')
   332             w(u'</table>')
   333             if self._main_display_fields:
   333             if self._main_display_fields:
   378         rendered = super(EntityFormRenderer, self).render(form, values)
   378         rendered = super(EntityFormRenderer, self).render(form, values)
   379         return rendered + u'</div>' # close extra div introducted by open_form
   379         return rendered + u'</div>' # close extra div introducted by open_form
   380 
   380 
   381     def open_form(self, form, values):
   381     def open_form(self, form, values):
   382         attrs_fs_label = ('<div class="iformTitle"><span>%s</span></div>'
   382         attrs_fs_label = ('<div class="iformTitle"><span>%s</span></div>'
   383                           % self.req._('main informations'))
   383                           % self._cw._('main informations'))
   384         attrs_fs_label += '<div class="formBody">'
   384         attrs_fs_label += '<div class="formBody">'
   385         return attrs_fs_label + super(EntityFormRenderer, self).open_form(form, values)
   385         return attrs_fs_label + super(EntityFormRenderer, self).open_form(form, values)
   386 
   386 
   387     def render_fields(self, w, form, values):
   387     def render_fields(self, w, form, values):
   388         super(EntityFormRenderer, self).render_fields(w, form, values)
   388         super(EntityFormRenderer, self).render_fields(w, form, values)
   411 
   411 
   412     def relations_form(self, w, form):
   412     def relations_form(self, w, form):
   413         srels_by_cat = form.srelations_by_category('generic', 'add', strict=True)
   413         srels_by_cat = form.srelations_by_category('generic', 'add', strict=True)
   414         if not srels_by_cat:
   414         if not srels_by_cat:
   415             return u''
   415             return u''
   416         req = self.req
   416         req = self._cw
   417         _ = req._
   417         _ = req._
   418         __ = _
   418         __ = _
   419         label = u'%s :' % __('This %s' % form.edited_entity.e_schema).capitalize()
   419         label = u'%s :' % __('This %s' % form.edited_entity.e_schema).capitalize()
   420         eid = form.edited_entity.eid
   420         eid = form.edited_entity.eid
   421         w(u'<fieldset class="subentity">')
   421         w(u'<fieldset class="subentity">')
   431                     w(u'<li class="invisible">%s<div id="span%s" class="%s">%s</div></li>'
   431                     w(u'<li class="invisible">%s<div id="span%s" class="%s">%s</div></li>'
   432                       % (viewparams[1], viewparams[0], viewparams[2], viewparams[3]))
   432                       % (viewparams[1], viewparams[0], viewparams[2], viewparams[3]))
   433                 if not form.force_display and form.maxrelitems < len(related):
   433                 if not form.force_display and form.maxrelitems < len(related):
   434                     link = (u'<span class="invisible">'
   434                     link = (u'<span class="invisible">'
   435                             '[<a href="javascript: window.location.href+=\'&amp;__force_display=1\'">%s</a>]'
   435                             '[<a href="javascript: window.location.href+=\'&amp;__force_display=1\'">%s</a>]'
   436                             '</span>' % self.req._('view all'))
   436                             '</span>' % self._cw._('view all'))
   437                     w(u'<li class="invisible">%s</li>' % link)
   437                     w(u'<li class="invisible">%s</li>' % link)
   438                 w(u'</ul>')
   438                 w(u'</ul>')
   439                 w(u'</td>')
   439                 w(u'</td>')
   440                 w(u'</tr>')
   440                 w(u'</tr>')
   441         pendings = list(form.restore_pending_inserts())
   441         pendings = list(form.restore_pending_inserts())
   489             if form.should_inline_relation_form(rschema, targettype, role):
   489             if form.should_inline_relation_form(rschema, targettype, role):
   490                 self.inline_relation_form(w, form, rschema, targettype, role)
   490                 self.inline_relation_form(w, form, rschema, targettype, role)
   491 
   491 
   492     def inline_relation_form(self, w, form, rschema, targettype, role):
   492     def inline_relation_form(self, w, form, rschema, targettype, role):
   493         entity = form.edited_entity
   493         entity = form.edited_entity
   494         __ = self.req.pgettext
   494         __ = self._cw.pgettext
   495         i18nctx = 'inlined:%s.%s.%s' % (entity.e_schema, rschema, role)
   495         i18nctx = 'inlined:%s.%s.%s' % (entity.e_schema, rschema, role)
   496         w(u'<div id="inline%sslot">' % rschema)
   496         w(u'<div id="inline%sslot">' % rschema)
   497         existant = form.display_inline_edition_form(w, rschema, targettype,
   497         existant = form.display_inline_edition_form(w, rschema, targettype,
   498                                                     role, i18nctx)
   498                                                     role, i18nctx)
   499         if role == 'subject':
   499         if role == 'subject':
   537             w(u'<div id="div-%(divid)s" onclick="%(divonclick)s">' % values)
   537             w(u'<div id="div-%(divid)s" onclick="%(divonclick)s">' % values)
   538         except KeyError:
   538         except KeyError:
   539             w(u'<div id="div-%(divid)s">' % values)
   539             w(u'<div id="div-%(divid)s">' % values)
   540         else:
   540         else:
   541             w(u'<div id="notice-%s" class="notice">%s</div>' % (
   541             w(u'<div id="notice-%s" class="notice">%s</div>' % (
   542                 values['divid'], self.req._('click on the box to cancel the deletion')))
   542                 values['divid'], self._cw._('click on the box to cancel the deletion')))
   543         w(u'<div class="iformBody">')
   543         w(u'<div class="iformBody">')
   544         eschema = form.edited_entity.e_schema
   544         eschema = form.edited_entity.e_schema
   545         ctx = values.pop('i18nctx')
   545         ctx = values.pop('i18nctx')
   546         values['removemsg'] = self.req.pgettext(ctx, 'remove this %s' % eschema)
   546         values['removemsg'] = self._cw.pgettext(ctx, 'remove this %s' % eschema)
   547         w(u'<div class="iformTitle"><span>%(title)s</span> '
   547         w(u'<div class="iformTitle"><span>%(title)s</span> '
   548           '#<span class="icounter">%(counter)s</span> '
   548           '#<span class="icounter">%(counter)s</span> '
   549           '[<a href="javascript: %(removejs)s;noop();">%(removemsg)s</a>]</div>'
   549           '[<a href="javascript: %(removejs)s;noop();">%(removemsg)s</a>]</div>'
   550           % values)
   550           % values)
   551         # cleanup values
   551         # cleanup values