author | Sandrine Ribeau <sandrine.ribeau@logilab.fr> |
Wed, 09 Dec 2009 12:23:31 +0100 | |
changeset 4073 | 03681ba6da0b |
parent 4023 | eae23c40627a |
child 4082 | c7117119e215 |
permissions | -rw-r--r-- |
0 | 1 |
"""abstract form classes for CubicWeb web client |
2 |
||
3 |
:organization: Logilab |
|
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1962
diff
changeset
|
4 |
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
0 | 5 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1962
diff
changeset
|
6 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
0 | 7 |
""" |
8 |
__docformat__ = "restructuredtext en" |
|
9 |
||
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
10 |
from logilab.common.decorators import iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
11 |
|
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2005
diff
changeset
|
12 |
from cubicweb.appobject import AppObject |
1133 | 13 |
from cubicweb.view import NOINDEX, NOFOLLOW |
4023
eae23c40627a
drop common subpackage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4003
diff
changeset
|
14 |
from cubicweb import tags |
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
|
15 |
from cubicweb.web import stdmsgs, httpcache, formfields |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
16 |
|
1097
611bacbbe001
pylint fixes, media definitions on form as well
sylvain.thenault@logilab.fr
parents:
1082
diff
changeset
|
17 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
18 |
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
|
19 |
"""abstract form view mix-in""" |
0 | 20 |
category = 'form' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
21 |
http_cache_manager = httpcache.NoHTTPCacheManager |
0 | 22 |
add_to_breadcrumbs = False |
1437 | 23 |
|
0 | 24 |
def html_headers(self): |
25 |
"""return a list of html headers (eg something to be inserted between |
|
26 |
<head> and </head> of the returned page |
|
27 |
||
28 |
by default forms are neither indexed nor followed |
|
29 |
""" |
|
30 |
return [NOINDEX, NOFOLLOW] |
|
1437 | 31 |
|
0 | 32 |
def linkable(self): |
33 |
"""override since forms are usually linked by an action, |
|
34 |
so we don't want them to be listed by appli.possible_views |
|
35 |
""" |
|
36 |
return False |
|
37 |
||
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
38 |
|
1437 | 39 |
# XXX should disappear |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
40 |
class FormMixIn(object): |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
41 |
"""abstract form mix-in |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
42 |
XXX: you should inherit from this FIRST (obscure pb with super call) |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
43 |
""" |
3922
69020a7c234a
refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3512
diff
changeset
|
44 |
force_session_key = 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
|
45 |
|
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
|
46 |
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
|
47 |
"""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
|
48 |
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
|
49 |
""" |
3925
25d5830b9531
force_session_key default to None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3923
diff
changeset
|
50 |
if self.force_session_key is None: |
3922
69020a7c234a
refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3512
diff
changeset
|
51 |
return '%s#%s' % (self.req.url(), self.domid) |
3925
25d5830b9531
force_session_key default to None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3923
diff
changeset
|
52 |
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
|
53 |
|
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
|
54 |
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
|
55 |
# 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
|
56 |
# 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
|
57 |
# 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
|
58 |
# method on successful commit |
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
|
59 |
forminfo = self.req.get_session_data(sessionkey, pop=True) |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
60 |
if forminfo: |
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
|
61 |
# XXX remove req.data assigment once cw.web.widget is killed |
3923
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
62 |
self.req.data['formvalues'] = self._form_previous_values = forminfo['values'] |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
63 |
self.req.data['formerrors'] = self._form_valerror = forminfo['errors'] |
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
|
64 |
self.req.data['displayederrors'] = self.form_displayed_errors = set() |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
65 |
# if some validation error occured on entity creation, we have to |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
66 |
# 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
|
67 |
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
|
68 |
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
|
69 |
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
|
70 |
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
|
71 |
break |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
72 |
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
|
73 |
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
|
74 |
else: |
3923
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
75 |
self._form_previous_values = {} |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
76 |
self._form_valerror = None |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
77 |
|
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
78 |
@property |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
79 |
def form_previous_values(self): |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
80 |
if self.parent_form is None: |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
81 |
return self._form_previous_values |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
82 |
return self.parent_form.form_previous_values |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
83 |
|
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
84 |
@property |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
85 |
def form_valerror(self): |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
86 |
if self.parent_form is None: |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
87 |
return self._form_valerror |
be05eeeb2db1
fix previous post values handling (eg on validation error) for sub-forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3922
diff
changeset
|
88 |
return self.parent_form.form_valerror |
1437 | 89 |
|
1519
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
90 |
# XXX deprecated with new form system. Should disappear |
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
91 |
|
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
92 |
domid = 'entityForm' |
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
93 |
category = 'form' |
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
94 |
controller = 'edit' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
95 |
http_cache_manager = httpcache.NoHTTPCacheManager |
1519
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
96 |
add_to_breadcrumbs = False |
5cfc5cc1dd20
fix retreival of previously submitted error for entity forms
sylvain.thenault@logilab.fr
parents:
1451
diff
changeset
|
97 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
98 |
def html_headers(self): |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
99 |
"""return a list of html headers (eg something to be inserted between |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
100 |
<head> and </head> of the returned page |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
101 |
|
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
102 |
by default forms are neither indexed nor followed |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
103 |
""" |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
104 |
return [NOINDEX, NOFOLLOW] |
1437 | 105 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
106 |
def linkable(self): |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
107 |
"""override since forms are usually linked by an action, |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
108 |
so we don't want them to be listed by appli.possible_views |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
109 |
""" |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
110 |
return False |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
111 |
|
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
112 |
|
1147 | 113 |
def button(self, label, klass='validateButton', tabindex=None, **kwargs): |
114 |
if tabindex is None: |
|
115 |
tabindex = self.req.next_tabindex() |
|
116 |
return tags.input(value=label, klass=klass, **kwargs) |
|
117 |
||
118 |
def action_button(self, label, onclick=None, __action=None, **kwargs): |
|
119 |
if onclick is None: |
|
120 |
onclick = "postForm('__action_%s', \'%s\', \'%s\')" % ( |
|
121 |
__action, label, self.domid) |
|
122 |
return self.button(label, onclick=onclick, **kwargs) |
|
123 |
||
124 |
def button_ok(self, label=None, type='submit', name='defaultsubmit', |
|
125 |
**kwargs): |
|
126 |
label = self.req._(label or stdmsgs.BUTTON_OK).capitalize() |
|
127 |
return self.button(label, name=name, type=type, **kwargs) |
|
1437 | 128 |
|
1147 | 129 |
def button_apply(self, label=None, type='button', **kwargs): |
130 |
label = self.req._(label or stdmsgs.BUTTON_APPLY).capitalize() |
|
131 |
return self.action_button(label, __action='apply', type=type, **kwargs) |
|
132 |
||
133 |
def button_delete(self, label=None, type='button', **kwargs): |
|
134 |
label = self.req._(label or stdmsgs.BUTTON_DELETE).capitalize() |
|
135 |
return self.action_button(label, __action='delete', type=type, **kwargs) |
|
1437 | 136 |
|
1147 | 137 |
def button_cancel(self, label=None, type='button', **kwargs): |
138 |
label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize() |
|
139 |
return self.action_button(label, __action='cancel', type=type, **kwargs) |
|
1437 | 140 |
|
1147 | 141 |
def button_reset(self, label=None, type='reset', name='__action_cancel', |
142 |
**kwargs): |
|
143 |
label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize() |
|
144 |
return self.button(label, type=type, **kwargs) |
|
145 |
||
1305
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
146 |
def need_multipart(self, entity, categories=('primary', 'secondary')): |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
147 |
"""return a boolean indicating if form's enctype should be multipart |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
148 |
""" |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
149 |
for rschema, _, x in entity.relations_by_category(categories): |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
150 |
if entity.get_widget(rschema, x).need_multipart: |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
151 |
return True |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
152 |
# let's find if any of our inlined entities needs multipart |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
153 |
for rschema, targettypes, x in entity.relations_by_category('inlineview'): |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
154 |
assert len(targettypes) == 1, \ |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
155 |
"I'm not able to deal with several targets and inlineview" |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
156 |
ttype = targettypes[0] |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
157 |
inlined_entity = self.vreg.etype_class(ttype)(self.req, None, None) |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
158 |
for irschema, _, x in inlined_entity.relations_by_category(categories): |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
159 |
if inlined_entity.get_widget(irschema, x).need_multipart: |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
160 |
return True |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
161 |
return False |
1437 | 162 |
|
0 | 163 |
def error_message(self): |
164 |
"""return formatted error message |
|
165 |
||
166 |
This method should be called once inlined field errors has been consumed |
|
167 |
""" |
|
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
|
168 |
errex = self.req.data.get('formerrors') or self.form_valerror |
0 | 169 |
# get extra errors |
170 |
if errex is not None: |
|
171 |
errormsg = self.req._('please correct the following errors:') |
|
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
|
172 |
displayed = self.req.data.get('displayederrors') or self.form_displayed_errors |
0 | 173 |
errors = sorted((field, err) for field, err in errex.errors.items() |
174 |
if not field in displayed) |
|
175 |
if errors: |
|
176 |
if len(errors) > 1: |
|
1437 | 177 |
templstr = '<li>%s</li>\n' |
0 | 178 |
else: |
2996
866a2c135c33
B #345282 xhtml requires to use   instead of
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2656
diff
changeset
|
179 |
templstr = ' %s\n' |
0 | 180 |
for field, err in errors: |
181 |
if field is None: |
|
182 |
errormsg += templstr % err |
|
183 |
else: |
|
184 |
errormsg += templstr % '%s: %s' % (self.req._(field), err) |
|
185 |
if len(errors) > 1: |
|
186 |
errormsg = '<ul>%s</ul>' % errormsg |
|
187 |
return u'<div class="errorMessage">%s</div>' % errormsg |
|
188 |
return u'' |
|
844 | 189 |
|
190 |
||
191 |
############################################################################### |
|
192 |
||
193 |
class metafieldsform(type): |
|
1406
133476216f4a
define self.fields before it is used ...
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1400
diff
changeset
|
194 |
"""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
|
195 |
and put them into a single ordered list: '_fields_'. |
1393 | 196 |
""" |
844 | 197 |
def __new__(mcs, name, bases, classdict): |
198 |
allfields = [] |
|
199 |
for base in bases: |
|
200 |
if hasattr(base, '_fields_'): |
|
201 |
allfields += base._fields_ |
|
202 |
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
|
203 |
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
|
204 |
for fieldname, field in sorted(clsfields, key=lambda x: x[1].creation_rank): |
844 | 205 |
if not field.name: |
869
168ad6d424d1
form to edit multiple entities, use it in DeleteConfForm
sylvain.thenault@logilab.fr
parents:
867
diff
changeset
|
206 |
field.set_name(fieldname) |
844 | 207 |
allfields.append(field) |
208 |
classdict['_fields_'] = allfields |
|
209 |
return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) |
|
1270 | 210 |
|
1437 | 211 |
|
1270 | 212 |
class FieldNotFound(Exception): |
213 |
"""raised by field_by_name when a field with the given name has not been |
|
214 |
found |
|
215 |
""" |
|
1437 | 216 |
|
3475
9c07e6c48e35
[forms] drop FormMixIn deprecated in 3.2
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
217 |
class Form(AppObject): |
844 | 218 |
__metaclass__ = metafieldsform |
1047
21d4d5e6aa45
make forms selectable (appobject)
sylvain.thenault@logilab.fr
parents:
1032
diff
changeset
|
219 |
__registry__ = 'forms' |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
220 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
221 |
parent_form = None |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
222 |
force_session_key = None |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
223 |
|
3475
9c07e6c48e35
[forms] drop FormMixIn deprecated in 3.2
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
224 |
def __init__(self, req, rset, **kwargs): |
9c07e6c48e35
[forms] drop FormMixIn deprecated in 3.2
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
225 |
super(Form, self).__init__(req, rset=rset, **kwargs) |
9c07e6c48e35
[forms] drop FormMixIn deprecated in 3.2
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
226 |
self.restore_previous_post(self.session_key()) |
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
227 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
228 |
@property |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
229 |
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
|
230 |
"""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
|
231 |
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
|
232 |
return self |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
233 |
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
|
234 |
|
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
235 |
@property |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
236 |
def form_previous_values(self): |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
237 |
if self.parent_form is None: |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
238 |
return self._form_previous_values |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
239 |
return self.parent_form.form_previous_values |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
240 |
|
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
241 |
@property |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
242 |
def form_valerror(self): |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
243 |
if self.parent_form is None: |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
244 |
return self._form_valerror |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
245 |
return self.parent_form.form_valerror |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
246 |
|
3512
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
247 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
248 |
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
|
249 |
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
|
250 |
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
|
251 |
else: |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
252 |
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
|
253 |
return fields |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
254 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
255 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
256 |
def field_by_name(cls_or_self, name, role='subject'): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
257 |
"""return field with the given name and role. |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
258 |
Raise FieldNotFound if the field can't be found. |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
259 |
""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
260 |
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
|
261 |
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
|
262 |
return field |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
263 |
raise FieldNotFound(name) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
264 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
265 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
266 |
def fields_by_name(cls_or_self, name, role='subject'): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
267 |
"""return a list of fields with the given name and role""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
268 |
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
|
269 |
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
|
270 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
271 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
272 |
def remove_field(cls_or_self, field): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
273 |
"""remove a field from form class or instance""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
274 |
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
|
275 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
276 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
277 |
def append_field(cls_or_self, field): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
278 |
"""append a field to form class or instance""" |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
279 |
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
|
280 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
281 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
282 |
def insert_field_before(cls_or_self, new_field, name, role='subject'): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
283 |
field = cls_or_self.field_by_name(name, role) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
284 |
fields = 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
|
285 |
fields.insert(fields.index(field), new_field) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
286 |
|
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
287 |
@iclassmethod |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
288 |
def insert_field_after(cls_or_self, new_field, name, role='subject'): |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
289 |
field = cls_or_self.field_by_name(name, role) |
2ceaa4e40348
move low-level form handling to base form class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2996
diff
changeset
|
290 |
fields = 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
|
291 |
fields.insert(fields.index(field)+1, new_field) |
3524 | 292 |
|
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
|
293 |
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
|
294 |
"""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
|
295 |
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
|
296 |
""" |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
297 |
if self.force_session_key is None: |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
298 |
return '%s#%s' % (self.req.url(), self.domid) |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
299 |
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
|
300 |
|
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
|
301 |
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
|
302 |
# 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
|
303 |
# 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
|
304 |
# 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
|
305 |
# method on successful commit |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3023
diff
changeset
|
306 |
forminfo = self._cw.get_session_data(sessionkey, pop=True) |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
307 |
if forminfo: |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
308 |
# XXX remove _cw.data assigment once cw.web.widget is killed |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
309 |
self._cw.data['formvalues'] = self._form_previous_values = forminfo['values'] |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
310 |
self._cw.data['formerrors'] = self._form_valerror = forminfo['errors'] |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3023
diff
changeset
|
311 |
self._cw.data['displayederrors'] = self.form_displayed_errors = set() |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
312 |
# if some validation error occured on entity creation, we have to |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
313 |
# 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
|
314 |
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
|
315 |
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
|
316 |
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
|
317 |
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
|
318 |
break |
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1315
diff
changeset
|
319 |
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
|
320 |
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
|
321 |
else: |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
322 |
self._form_previous_values = {} |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
323 |
self._form_valerror = None |