web/form.py
changeset 4224 5998df006968
parent 4165 eb9acad29407
child 4235 49eb7e87d36d
equal deleted inserted replaced
4223:4fb00ccad3df 4224:5998df006968
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 """
     7 """
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 
     9 
       
    10 from warnings import warn
       
    11 
    10 from logilab.common.decorators import iclassmethod
    12 from logilab.common.decorators import iclassmethod
       
    13 from logilab.common.deprecation import deprecated
    11 
    14 
    12 from cubicweb.appobject import AppObject
    15 from cubicweb.appobject import AppObject
    13 from cubicweb.view import NOINDEX, NOFOLLOW
    16 from cubicweb.view import NOINDEX, NOFOLLOW
    14 from cubicweb import tags
    17 from cubicweb import tags
    15 from cubicweb.web import stdmsgs, httpcache, formfields
    18 from cubicweb.web import stdmsgs, httpcache, formfields
    79         if self.parent_form is None:
    82         if self.parent_form is None:
    80             return self
    83             return self
    81         return self.parent_form.root_form
    84         return self.parent_form.root_form
    82 
    85 
    83     @property
    86     @property
       
    87     def form_valerror(self):
       
    88         """the validation error exception if any"""
       
    89         if self.parent_form is None:
       
    90             return self._form_valerror
       
    91         return self.parent_form.form_valerror
       
    92 
       
    93     @property
    84     def form_previous_values(self):
    94     def form_previous_values(self):
       
    95         """previously posted values (on validation error)"""
    85         if self.parent_form is None:
    96         if self.parent_form is None:
    86             return self._form_previous_values
    97             return self._form_previous_values
    87         return self.parent_form.form_previous_values
    98         return self.parent_form.form_previous_values
    88 
       
    89     @property
       
    90     def form_valerror(self):
       
    91         if self.parent_form is None:
       
    92             return self._form_valerror
       
    93         return self.parent_form.form_valerror
       
    94 
    99 
    95     @iclassmethod
   100     @iclassmethod
    96     def _fieldsattr(cls_or_self):
   101     def _fieldsattr(cls_or_self):
    97         if isinstance(cls_or_self, type):
   102         if isinstance(cls_or_self, type):
    98             fields = cls_or_self._fields_
   103             fields = cls_or_self._fields_
   151         # deleting validation errors here breaks form reloading (errors are
   156         # deleting validation errors here breaks form reloading (errors are
   152         # no more available), they have to be deleted by application's publish
   157         # no more available), they have to be deleted by application's publish
   153         # method on successful commit
   158         # method on successful commit
   154         forminfo = self._cw.get_session_data(sessionkey, pop=True)
   159         forminfo = self._cw.get_session_data(sessionkey, pop=True)
   155         if forminfo:
   160         if forminfo:
   156             # XXX remove _cw.data assigment once cw.web.widget is killed
   161             self._form_previous_values = forminfo['values']
   157             self._cw.data['formvalues'] = self._form_previous_values = forminfo['values']
   162             self._form_valerror = forminfo['error']
   158             self._cw.data['formerrors'] = self._form_valerror = forminfo['errors']
       
   159             self._cw.data['displayederrors'] = self.form_displayed_errors = set()
       
   160             # if some validation error occured on entity creation, we have to
   163             # if some validation error occured on entity creation, we have to
   161             # get the original variable name from its attributed eid
   164             # get the original variable name from its attributed eid
   162             foreid = self.form_valerror.entity
   165             foreid = self.form_valerror.entity
   163             for var, eid in forminfo['eidmap'].items():
   166             for var, eid in forminfo['eidmap'].items():
   164                 if foreid == eid:
   167                 if foreid == eid:
   167             else:
   170             else:
   168                 self.form_valerror.eid = foreid
   171                 self.form_valerror.eid = foreid
   169         else:
   172         else:
   170             self._form_previous_values = {}
   173             self._form_previous_values = {}
   171             self._form_valerror = None
   174             self._form_valerror = None
       
   175 
       
   176     def field_error(self, field):
       
   177         """return field's error if specified in current validation exception"""
       
   178         if self.form_valerror:
       
   179             if field.eidparam and self.edited_entity.eid != self.form_valerror.eid:
       
   180                 return None
       
   181             try:
       
   182                 return self.form_valerror.errors.pop(field.role_name())
       
   183             except KeyError:
       
   184                 if field.role and field.name in self.form_valerror:
       
   185                     warn('%s: errors key of attribute/relation should be suffixed by "-<role>"'
       
   186                          % self.form_valerror.__class__, DeprecationWarning)
       
   187                     return self.form_valerror.errors.pop(field.name)
       
   188         return None
       
   189 
       
   190     def remaining_errors(self):
       
   191         return sorted(self.form_valerror.errors.items())
       
   192 
       
   193     @deprecated('[3.6] use form.field_error and/or new renderer.render_error method')
       
   194     def form_field_error(self, field):
       
   195         """return validation error for widget's field, if any"""
       
   196         err = self.field_error(field)
       
   197         if err:
       
   198             return u'<span class="error">%s</span>' % err
       
   199         return u''
       
   200