author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 08 Mar 2011 18:21:40 +0100 | |
branch | stable |
changeset 7060 | f26a1cbddc91 |
parent 6109 | 47d9c0e0f7b7 |
child 7432 | cab99ccdb774 |
permissions | -rw-r--r-- |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5369
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5588
377c9adfe81e
[forms] refactor action handling to ease overriding while keeping action overrideable by instance (closes #969167)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5547
diff
changeset
|
18 |
"""abstract form classes for CubicWeb web client""" |
0 | 19 |
__docformat__ = "restructuredtext en" |
20 |
||
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
21 |
from warnings import warn |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
22 |
|
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
23 |
from logilab.common.decorators import iclassmethod |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
24 |
from logilab.common.deprecation import deprecated |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
25 |
|
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2005
diff
changeset
|
26 |
from cubicweb.appobject import AppObject |
1133 | 27 |
from cubicweb.view import NOINDEX, NOFOLLOW |
5369
68c33344581c
fix NameError
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5368
diff
changeset
|
28 |
from cubicweb.web import httpcache, formfields, controller, formwidgets as fwdgs |
1097
611bacbbe001
pylint fixes, media definitions on form as well
sylvain.thenault@logilab.fr
parents:
1082
diff
changeset
|
29 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
30 |
class FormViewMixIn(object): |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
31 |
"""abstract form view mix-in""" |
0 | 32 |
category = 'form' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
33 |
http_cache_manager = httpcache.NoHTTPCacheManager |
0 | 34 |
add_to_breadcrumbs = False |
1437 | 35 |
|
0 | 36 |
def html_headers(self): |
37 |
"""return a list of html headers (eg something to be inserted between |
|
38 |
<head> and </head> of the returned page |
|
39 |
||
40 |
by default forms are neither indexed nor followed |
|
41 |
""" |
|
42 |
return [NOINDEX, NOFOLLOW] |
|
1437 | 43 |
|
0 | 44 |
def linkable(self): |
45 |
"""override since forms are usually linked by an action, |
|
46 |
so we don't want them to be listed by appli.possible_views |
|
47 |
""" |
|
48 |
return False |
|
49 |
||
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
50 |
|
844 | 51 |
############################################################################### |
52 |
||
53 |
class metafieldsform(type): |
|
1406
133476216f4a
define self.fields before it is used ...
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1400
diff
changeset
|
54 |
"""metaclass for FieldsForm to retrieve fields defined as class attributes |
133476216f4a
define self.fields before it is used ...
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1400
diff
changeset
|
55 |
and put them into a single ordered list: '_fields_'. |
1393 | 56 |
""" |
844 | 57 |
def __new__(mcs, name, bases, classdict): |
58 |
allfields = [] |
|
59 |
for base in bases: |
|
60 |
if hasattr(base, '_fields_'): |
|
61 |
allfields += base._fields_ |
|
62 |
clsfields = (item for item in classdict.items() |
|
2005
e8032965f37a
turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1995
diff
changeset
|
63 |
if isinstance(item[1], formfields.Field)) |
869
168ad6d424d1
form to edit multiple entities, use it in DeleteConfForm
sylvain.thenault@logilab.fr
parents:
867
diff
changeset
|
64 |
for fieldname, field in sorted(clsfields, key=lambda x: x[1].creation_rank): |
844 | 65 |
if not field.name: |
869
168ad6d424d1
form to edit multiple entities, use it in DeleteConfForm
sylvain.thenault@logilab.fr
parents:
867
diff
changeset
|
66 |
field.set_name(fieldname) |
844 | 67 |
allfields.append(field) |
68 |
classdict['_fields_'] = allfields |
|
69 |
return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) |
|
1270 | 70 |
|
1437 | 71 |
|
1270 | 72 |
class FieldNotFound(Exception): |
73 |
"""raised by field_by_name when a field with the given name has not been |
|
74 |
found |
|
75 |
""" |
|
1437 | 76 |
|
3475
9c07e6c48e35
[forms] drop FormMixIn deprecated in 3.2
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
77 |
class Form(AppObject): |
844 | 78 |
__metaclass__ = metafieldsform |
1047
21d4d5e6aa45
make forms selectable (appobject)
sylvain.thenault@logilab.fr
parents:
1032
diff
changeset
|
79 |
__registry__ = 'forms' |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
80 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
81 |
parent_form = None |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
82 |
force_session_key = None |
4668
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
83 |
domid = 'form' |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
84 |
copy_nav_params = False |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
85 |
|
4668
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
86 |
def __init__(self, req, rset=None, row=None, col=None, |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
87 |
submitmsg=None, mainform=True, **kwargs): |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
88 |
super(Form, self).__init__(req, rset=rset, row=row, col=col) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
89 |
self.fields = list(self.__class__._fields_) |
4683
c375d50eaad3
[form] only set __form_id for the main form, not for sub-forms. Should fix regression introduced by 4668:9f82f81bf13d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4668
diff
changeset
|
90 |
if mainform: |
c375d50eaad3
[form] only set __form_id for the main form, not for sub-forms. Should fix regression introduced by 4668:9f82f81bf13d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4668
diff
changeset
|
91 |
self.add_hidden(u'__form_id', kwargs.pop('formvid', self.__regid__)) |
4668
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
92 |
for key, val in kwargs.iteritems(): |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
93 |
if key in controller.NAV_FORM_PARAMETERS: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
94 |
self.add_hidden(key, val) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
95 |
elif key == 'redirect_path': |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
96 |
self.add_hidden(u'__redirectpath', val) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
97 |
elif hasattr(self.__class__, key) and not key[0] == '_': |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
98 |
setattr(self, key, val) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
99 |
else: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
100 |
self.cw_extra_kwargs[key] = val |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
101 |
# skip other parameters, usually given for selection |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
102 |
# (else write a custom class to handle them) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
103 |
if mainform: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
104 |
self.add_hidden(u'__errorurl', self.session_key()) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
105 |
self.add_hidden(u'__domid', self.domid) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
106 |
self.restore_previous_post(self.session_key()) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
107 |
# XXX why do we need two different variables (mainform and copy_nav_params ?) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
108 |
if self.copy_nav_params: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
109 |
for param in controller.NAV_FORM_PARAMETERS: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
110 |
if not param in kwargs: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
111 |
value = req.form.get(param) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
112 |
if value: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
113 |
self.add_hidden(param, value) |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
114 |
if submitmsg is not None: |
9f82f81bf13d
[form] fix #719285, due to multiple calls to restore_previous_post, by proper refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
115 |
self.add_hidden(u'__message', submitmsg) |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
116 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
117 |
@property |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
118 |
def root_form(self): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
119 |
"""return the root form""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
120 |
if self.parent_form is None: |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
121 |
return self |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
122 |
return self.parent_form.root_form |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
123 |
|
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
124 |
@property |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
125 |
def form_valerror(self): |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
126 |
"""the validation error exception if any""" |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
127 |
if self.parent_form is None: |
5358
d4d294610ee7
[forms] no crash if restore_previous_post has not be called, has in report bug form in management.py for instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
128 |
# unset if restore_previous_post has not be called |
d4d294610ee7
[forms] no crash if restore_previous_post has not be called, has in report bug form in management.py for instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
129 |
return getattr(self, '_form_valerror', None) |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
130 |
return self.parent_form.form_valerror |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
131 |
|
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
132 |
@property |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
133 |
def form_previous_values(self): |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
134 |
"""previously posted values (on validation error)""" |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
135 |
if self.parent_form is None: |
5358
d4d294610ee7
[forms] no crash if restore_previous_post has not be called, has in report bug form in management.py for instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
136 |
# unset if restore_previous_post has not be called |
d4d294610ee7
[forms] no crash if restore_previous_post has not be called, has in report bug form in management.py for instance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
137 |
return getattr(self, '_form_previous_values', {}) |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
138 |
return self.parent_form.form_previous_values |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
139 |
|
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
140 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
141 |
def _fieldsattr(cls_or_self): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
142 |
if isinstance(cls_or_self, type): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
143 |
fields = cls_or_self._fields_ |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
144 |
else: |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
145 |
fields = cls_or_self.fields |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
146 |
return fields |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
147 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
148 |
@iclassmethod |
4165
eb9acad29407
proper field's role handling: may be 'subject' / 'object' *in case
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4082
diff
changeset
|
149 |
def field_by_name(cls_or_self, name, role=None): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
150 |
"""Return field with the given name and role. |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
151 |
|
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
152 |
Raise :exc:`FieldNotFound` if the field can't be found. |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
153 |
""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
154 |
for field in cls_or_self._fieldsattr(): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
155 |
if field.name == name and field.role == role: |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
156 |
return field |
4235
49eb7e87d36d
specify name *and* role when raising FieldNotFound helps debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4224
diff
changeset
|
157 |
raise FieldNotFound(name, role) |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
158 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
159 |
@iclassmethod |
4165
eb9acad29407
proper field's role handling: may be 'subject' / 'object' *in case
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4082
diff
changeset
|
160 |
def fields_by_name(cls_or_self, name, role=None): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
161 |
"""Return a list of fields with the given name and role.""" |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
162 |
return [field for field in cls_or_self._fieldsattr() |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
163 |
if field.name == name and field.role == role] |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
164 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
165 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
166 |
def remove_field(cls_or_self, field): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
167 |
"""Remove the given field.""" |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
168 |
cls_or_self._fieldsattr().remove(field) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
169 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
170 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
171 |
def append_field(cls_or_self, field): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5367
diff
changeset
|
172 |
"""Append the given field.""" |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
173 |
cls_or_self._fieldsattr().append(field) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
174 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
175 |
@iclassmethod |
5367
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
176 |
def insert_field_before(cls_or_self, field, name, role=None): |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
177 |
"""Insert the given field before the field of given name and role.""" |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
178 |
bfield = cls_or_self.field_by_name(name, role) |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
179 |
fields = cls_or_self._fieldsattr() |
5367
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
180 |
fields.insert(fields.index(bfield), field) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
181 |
|
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
182 |
@iclassmethod |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
183 |
def insert_field_after(cls_or_self, field, name, role=None): |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
184 |
"""Insert the given field after the field of given name and role.""" |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
185 |
afield = cls_or_self.field_by_name(name, role) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
186 |
fields = cls_or_self._fieldsattr() |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
187 |
fields.insert(fields.index(afield)+1, field) |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
188 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
189 |
@iclassmethod |
5367
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
190 |
def add_hidden(cls_or_self, name, value=None, **kwargs): |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
191 |
"""Append an hidden field to the form. `name`, `value` and extra keyword |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
192 |
arguments will be given to the field constructor. The inserted field is |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
193 |
returned. |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
194 |
""" |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
195 |
kwargs.setdefault('ignore_req_params', True) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
196 |
kwargs.setdefault('widget', fwdgs.HiddenInput) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
197 |
field = formfields.StringField(name=name, value=value, **kwargs) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
198 |
if 'id' in kwargs: |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
199 |
# by default, hidden input don't set id attribute. If one is |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
200 |
# explicitly specified, ensure it will be set |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
201 |
field.widget.setdomid = True |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
202 |
cls_or_self.append_field(field) |
4176a50c81c9
[form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
203 |
return field |
3524 | 204 |
|
1525
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
205 |
def session_key(self): |
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
206 |
"""return the key that may be used to store / retreive data about a |
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
207 |
previous post which failed because of a validation error |
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
208 |
""" |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
209 |
if self.force_session_key is None: |
4082
c7117119e215
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4023
diff
changeset
|
210 |
return '%s#%s' % (self._cw.url(), self.domid) |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
211 |
return self.force_session_key |
1525
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
212 |
|
cc2e2cbd7019
include dom id of the form in __errorurl in case there are multiple forms in a page
sylvain.thenault@logilab.fr
parents:
1519
diff
changeset
|
213 |
def restore_previous_post(self, sessionkey): |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
214 |
# get validation session data which may have been previously set. |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
215 |
# deleting validation errors here breaks form reloading (errors are |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
216 |
# no more available), they have to be deleted by application's publish |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
217 |
# method on successful commit |
4779
dce36da37d40
fix: Prevent multi pass in restore_previous_post
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4719
diff
changeset
|
218 |
if hasattr(self, '_form_previous_values'): |
dce36da37d40
fix: Prevent multi pass in restore_previous_post
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4719
diff
changeset
|
219 |
# XXX behaviour changed in 3.6.1, warn |
dce36da37d40
fix: Prevent multi pass in restore_previous_post
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4719
diff
changeset
|
220 |
warn('[3.6.1] restore_previous_post already called, remove this call', |
dce36da37d40
fix: Prevent multi pass in restore_previous_post
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4719
diff
changeset
|
221 |
DeprecationWarning, stacklevel=2) |
dce36da37d40
fix: Prevent multi pass in restore_previous_post
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4719
diff
changeset
|
222 |
return |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4779
diff
changeset
|
223 |
forminfo = self._cw.session.data.pop(sessionkey, None) |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
224 |
if forminfo: |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
225 |
self._form_previous_values = forminfo['values'] |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
226 |
self._form_valerror = forminfo['error'] |
6109
47d9c0e0f7b7
integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5588
diff
changeset
|
227 |
# if some validation error occurred on entity creation, we have to |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
228 |
# get the original variable name from its attributed eid |
1710
8c717cc0b353
refactor error handling: get validation error information from a form attribute instead of req.data to avoid pb when multiple forms are displayed
sylvain.thenault@logilab.fr
parents:
1701
diff
changeset
|
229 |
foreid = self.form_valerror.entity |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
230 |
for var, eid in forminfo['eidmap'].items(): |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
231 |
if foreid == eid: |
1710
8c717cc0b353
refactor error handling: get validation error information from a form attribute instead of req.data to avoid pb when multiple forms are displayed
sylvain.thenault@logilab.fr
parents:
1701
diff
changeset
|
232 |
self.form_valerror.eid = var |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
233 |
break |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
234 |
else: |
1710
8c717cc0b353
refactor error handling: get validation error information from a form attribute instead of req.data to avoid pb when multiple forms are displayed
sylvain.thenault@logilab.fr
parents:
1701
diff
changeset
|
235 |
self.form_valerror.eid = foreid |
8c717cc0b353
refactor error handling: get validation error information from a form attribute instead of req.data to avoid pb when multiple forms are displayed
sylvain.thenault@logilab.fr
parents:
1701
diff
changeset
|
236 |
else: |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
237 |
self._form_previous_values = {} |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
238 |
self._form_valerror = None |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
239 |
|
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
240 |
def field_error(self, field): |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
241 |
"""return field's error if specified in current validation exception""" |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
242 |
if self.form_valerror: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
243 |
if field.eidparam and self.edited_entity.eid != self.form_valerror.eid: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
244 |
return None |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
245 |
try: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
246 |
return self.form_valerror.errors.pop(field.role_name()) |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
247 |
except KeyError: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
248 |
if field.role and field.name in self.form_valerror: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
249 |
warn('%s: errors key of attribute/relation should be suffixed by "-<role>"' |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
250 |
% self.form_valerror.__class__, DeprecationWarning) |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
251 |
return self.form_valerror.errors.pop(field.name) |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
252 |
return None |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
253 |
|
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
254 |
def remaining_errors(self): |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
255 |
return sorted(self.form_valerror.errors.items()) |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
256 |
|
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
257 |
@deprecated('[3.6] use form.field_error and/or new renderer.render_error method') |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
258 |
def form_field_error(self, field): |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
259 |
"""return validation error for widget's field, if any""" |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
260 |
err = self.field_error(field) |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
261 |
if err: |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
262 |
return u'<span class="error">%s</span>' % err |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
263 |
return u'' |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4165
diff
changeset
|
264 |