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' '.join(help) |
114 return u' '.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+=\'&__force_display=1\'">%s</a>]' |
435 '[<a href="javascript: window.location.href+=\'&__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 |