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 |