--- a/web/views/forms.py Mon Nov 23 14:13:53 2009 +0100
+++ b/web/views/forms.py Thu Dec 03 17:17:43 2009 +0100
@@ -10,6 +10,7 @@
from warnings import warn
from logilab.common.compat import any
+from logilab.common.deprecation import deprecated
from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset
from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param
@@ -89,6 +90,8 @@
if mainform:
self.form_add_hidden('__errorurl', self.session_key())
self.form_add_hidden('__domid', self.domid)
+ self.restore_previous_post(self.session_key())
+
# XXX why do we need two different variables (mainform and copy_nav_params ?)
if self.copy_nav_params:
for param in NAV_FORM_PARAMETERS:
@@ -125,15 +128,14 @@
if self.needs_css:
self._cw.add_css(self.needs_css)
- def form_render(self, **values):
+ def render(self, formvalues=None, rendervalues=None, renderer=None):
"""render this form, using the renderer given in args or the default
FormRenderer()
"""
- self.build_context(values)
- renderer = values.pop('renderer', None)
+ self.build_context(formvalues or {})
if renderer is None:
renderer = self.form_default_renderer()
- return renderer.render(self, values)
+ return renderer.render(self, rendervalues or {})
def form_default_renderer(self):
return self._cw.vreg['formrenderers'].select(self.form_renderer_id,
@@ -146,8 +148,8 @@
containing field 'name' (qualified), 'id', 'value' (for display, always
a string).
- rendervalues is an optional dictionary containing extra kwargs given to
- form_render()
+ rendervalues is an optional dictionary containing extra form values
+ given to render()
"""
if self.context is not None:
return # already built
@@ -249,6 +251,17 @@
"""
return self.form_valerror and field.name in self.form_valerror.errors
+ @deprecated('use .render(formvalues, rendervalues)')
+ def form_render(self, **values):
+ """render this form, using the renderer given in args or the default
+ FormRenderer()
+ """
+ self.build_context(values)
+ renderer = values.pop('renderer', None)
+ if renderer is None:
+ renderer = self.form_default_renderer()
+ return renderer.render(self, values)
+
class EntityFieldsForm(FieldsForm):
__regid__ = 'base'
@@ -279,6 +292,19 @@
if msg:
self.form_add_hidden('__message', msg)
+ def session_key(self):
+ """return the key that may be used to store / retreive data about a
+ previous post which failed because of a validation error
+ """
+ try:
+ return self.force_session_key
+ except AttributeError:
+ # XXX if this is a json request, suppose we should redirect to the
+ # entity primary view
+ if self.req.json_request:
+ return '%s#%s' % (self.edited_entity.absolute_url(), self.domid)
+ return '%s#%s' % (self.req.url(), self.domid)
+
def _field_has_error(self, field):
"""return true if the field has some error in given validation exception
"""
@@ -401,6 +427,8 @@
return eid_param(field.id, self.edited_entity.eid)
return field.id
+ # XXX all this vocabulary handling should be on the field, no?
+
def form_field_vocabulary(self, field, limit=None):
"""return vocabulary for the given field"""
role, rtype = field.role, field.name