8 __docformat__ = "restructuredtext en" |
8 __docformat__ = "restructuredtext en" |
9 |
9 |
10 from warnings import warn |
10 from warnings import warn |
11 |
11 |
12 from logilab.common.compat import any |
12 from logilab.common.compat import any |
|
13 from logilab.common.deprecation import deprecated |
13 |
14 |
14 from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset |
15 from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset |
15 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param |
16 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param |
16 from cubicweb.web import form, formwidgets as fwdgs |
17 from cubicweb.web import form, formwidgets as fwdgs |
17 from cubicweb.web.controller import NAV_FORM_PARAMETERS |
18 from cubicweb.web.controller import NAV_FORM_PARAMETERS |
125 if self.needs_js: |
126 if self.needs_js: |
126 self.req.add_js(self.needs_js) |
127 self.req.add_js(self.needs_js) |
127 if self.needs_css: |
128 if self.needs_css: |
128 self.req.add_css(self.needs_css) |
129 self.req.add_css(self.needs_css) |
129 |
130 |
130 def form_render(self, **values): |
131 def render(self, formvalues=None, rendervalues=None, renderer=None): |
131 """render this form, using the renderer given in args or the default |
132 """render this form, using the renderer given in args or the default |
132 FormRenderer() |
133 FormRenderer() |
133 """ |
134 """ |
134 self.build_context(values) |
135 self.build_context(formvalues or {}) |
135 renderer = values.pop('renderer', None) |
|
136 if renderer is None: |
136 if renderer is None: |
137 renderer = self.form_default_renderer() |
137 renderer = self.form_default_renderer() |
138 return renderer.render(self, values) |
138 return renderer.render(self, rendervalues or {}) |
139 |
139 |
140 def form_default_renderer(self): |
140 def form_default_renderer(self): |
141 return self.vreg['formrenderers'].select(self.form_renderer_id, |
141 return self.vreg['formrenderers'].select(self.form_renderer_id, |
142 self.req, rset=self.rset, |
142 self.req, rset=self.rset, |
143 row=self.row, col=self.col) |
143 row=self.row, col=self.col) |
146 """build form context values (the .context attribute which is a |
146 """build form context values (the .context attribute which is a |
147 dictionary with field instance as key associated to a dictionary |
147 dictionary with field instance as key associated to a dictionary |
148 containing field 'name' (qualified), 'id', 'value' (for display, always |
148 containing field 'name' (qualified), 'id', 'value' (for display, always |
149 a string). |
149 a string). |
150 |
150 |
151 rendervalues is an optional dictionary containing extra kwargs given to |
151 rendervalues is an optional dictionary containing extra form values |
152 form_render() |
152 given to render() |
153 """ |
153 """ |
154 if self.context is not None: |
154 if self.context is not None: |
155 return # already built |
155 return # already built |
156 self.context = context = {} |
156 self.context = context = {} |
157 # ensure rendervalues is a dict |
157 # ensure rendervalues is a dict |
245 |
245 |
246 def _field_has_error(self, field): |
246 def _field_has_error(self, field): |
247 """return true if the field has some error in given validation exception |
247 """return true if the field has some error in given validation exception |
248 """ |
248 """ |
249 return self.form_valerror and field.name in self.form_valerror.errors |
249 return self.form_valerror and field.name in self.form_valerror.errors |
|
250 |
|
251 @deprecated('use .render(formvalues, rendervalues)') |
|
252 def form_render(self, **values): |
|
253 """render this form, using the renderer given in args or the default |
|
254 FormRenderer() |
|
255 """ |
|
256 self.build_context(values) |
|
257 renderer = values.pop('renderer', None) |
|
258 if renderer is None: |
|
259 renderer = self.form_default_renderer() |
|
260 return renderer.render(self, values) |
250 |
261 |
251 |
262 |
252 class EntityFieldsForm(FieldsForm): |
263 class EntityFieldsForm(FieldsForm): |
253 id = 'base' |
264 id = 'base' |
254 __select__ = (match_kwargs('entity') |
265 __select__ = (match_kwargs('entity') |
440 """return dom id for the given field""" |
451 """return dom id for the given field""" |
441 if field.eidparam: |
452 if field.eidparam: |
442 return eid_param(field.id, self.edited_entity.eid) |
453 return eid_param(field.id, self.edited_entity.eid) |
443 return field.id |
454 return field.id |
444 |
455 |
|
456 # XXX all this vocabulary handling should be on the field, no? |
|
457 |
445 def form_field_vocabulary(self, field, limit=None): |
458 def form_field_vocabulary(self, field, limit=None): |
446 """return vocabulary for the given field""" |
459 """return vocabulary for the given field""" |
447 role, rtype = field.role, field.name |
460 role, rtype = field.role, field.name |
448 method = '%s_%s_vocabulary' % (role, rtype) |
461 method = '%s_%s_vocabulary' % (role, rtype) |
449 try: |
462 try: |
462 # important because `vocabfunc` might return a list with |
475 # important because `vocabfunc` might return a list with |
463 # couples (label, None) which act as separators. In these |
476 # couples (label, None) which act as separators. In these |
464 # cases, it doesn't make sense to sort results afterwards. |
477 # cases, it doesn't make sense to sort results afterwards. |
465 return vocabfunc(rtype, limit) |
478 return vocabfunc(rtype, limit) |
466 |
479 |
467 # XXX should be on the field, no? |
|
468 def subject_relation_vocabulary(self, rtype, limit=None): |
480 def subject_relation_vocabulary(self, rtype, limit=None): |
469 """defaut vocabulary method for the given relation, looking for |
481 """defaut vocabulary method for the given relation, looking for |
470 relation's object entities (i.e. self is the subject) |
482 relation's object entities (i.e. self is the subject) |
471 """ |
483 """ |
472 entity = self.edited_entity |
484 entity = self.edited_entity |