# HG changeset patch # User Sylvain Thénault # Date 1343926347 -7200 # Node ID f15e90b914cd13dfc1f0722223060898067a2279 # Parent 7801f2acd1dcad00e2260628902a7107fc8290ce [web form] refactor Form.__init__ so that extra kwargs are set earlier in the process. Closes #2443040 (eg if you want to use them in .session_key) diff -r 7801f2acd1dc -r f15e90b914cd web/form.py --- a/web/form.py Thu Aug 02 12:48:31 2012 +0200 +++ b/web/form.py Thu Aug 02 18:52:27 2012 +0200 @@ -88,23 +88,19 @@ def __init__(self, req, rset=None, row=None, col=None, submitmsg=None, mainform=True, **kwargs): - super(Form, self).__init__(req, rset=rset, row=row, col=col) + # process kwargs first so we can properly pass them to Form and match + # order expectation (ie cw_extra_kwargs populated almost first) + hiddens, extrakw = self._process_kwargs(kwargs) + # now call ancestor init + super(Form, self).__init__(req, rset=rset, row=row, col=col, **extrakw) + # then continue with further specific initialization self.fields = list(self.__class__._fields_) + for key, val in hiddens: + self.add_hidden(key, val) if mainform: formid = kwargs.pop('formvid', self.__regid__) self.add_hidden(u'__form_id', formid) self._posting = self._cw.form.get('__form_id') == formid - for key, val in kwargs.iteritems(): - if key in controller.NAV_FORM_PARAMETERS: - self.add_hidden(key, val) - elif key == 'redirect_path': - self.add_hidden(u'__redirectpath', val) - elif hasattr(self.__class__, key) and not key[0] == '_': - setattr(self, key, val) - else: - self.cw_extra_kwargs[key] = val - # skip other parameters, usually given for selection - # (else write a custom class to handle them) if mainform: self.add_hidden(u'__errorurl', self.session_key()) self.add_hidden(u'__domid', self.domid) @@ -119,6 +115,22 @@ if submitmsg is not None: self.set_message(submitmsg) + def _process_kwargs(self, kwargs): + hiddens = [] + extrakw = {} + # search for navigation parameters and customization of existing + # attributes; remaining stuff goes in extrakwargs + for key, val in kwargs.iteritems(): + if key in controller.NAV_FORM_PARAMETERS: + hiddens.append( (key, val) ) + elif key == 'redirect_path': + hiddens.append( (u'__redirectpath', val) ) + elif hasattr(self.__class__, key) and not key[0] == '_': + setattr(self, key, val) + else: + extrakw[key] = val + return hiddens, extrakw + def set_message(self, submitmsg): """sets a submitmsg if exists, using _cwmsgid mechanism """ cwmsgid = self._cw.set_redirect_message(submitmsg)