author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 09 Dec 2015 17:44:16 +0100 | |
changeset 10999 | adc46197b8c9 |
parent 10907 | 9ae707db5265 |
permissions | -rw-r--r-- |
10006
8391bf718485
remove most 3.10 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9717
diff
changeset
|
1 |
# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
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:
5405
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
18 |
""" |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
19 |
Renderers |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
20 |
--------- |
1147 | 21 |
|
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
22 |
.. Note:: |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
23 |
Form renderers are responsible to layout a form to HTML. |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
24 |
|
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
25 |
Here are the base renderers available: |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
26 |
|
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
27 |
.. autoclass:: cubicweb.web.views.formrenderers.FormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
28 |
.. autoclass:: cubicweb.web.views.formrenderers.HTableFormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
29 |
.. autoclass:: cubicweb.web.views.formrenderers.EntityCompositeFormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
30 |
.. autoclass:: cubicweb.web.views.formrenderers.EntityFormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
31 |
.. autoclass:: cubicweb.web.views.formrenderers.EntityInlinedFormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
32 |
|
1147 | 33 |
""" |
6582
8eb7883b4223
[pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6575
diff
changeset
|
34 |
|
1147 | 35 |
__docformat__ = "restructuredtext en" |
10666
7f6b5f023884
[py3k] replace '_ = unicode' in global scope (closes #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10664
diff
changeset
|
36 |
from cubicweb import _ |
1147 | 37 |
|
3478
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
38 |
from warnings import warn |
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
39 |
|
10696
4ba4be5553cf
[py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10666
diff
changeset
|
40 |
from six import text_type |
4ba4be5553cf
[py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10666
diff
changeset
|
41 |
|
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2247
diff
changeset
|
42 |
from logilab.mtconverter import xml_escape |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7582
diff
changeset
|
43 |
from logilab.common.registry import yes |
1147 | 44 |
|
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
45 |
from cubicweb import tags, uilib |
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2586
diff
changeset
|
46 |
from cubicweb.appobject import AppObject |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7582
diff
changeset
|
47 |
from cubicweb.predicates import is_instance |
6082
57933567146f
[forms] callable field kwargs now always take form _and_ field parameters
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5940
diff
changeset
|
48 |
from cubicweb.utils import json_dumps, support_args |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
49 |
from cubicweb.web import eid_param, formwidgets as fwdgs |
1147 | 50 |
|
3478
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
51 |
|
2819
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
52 |
def checkbox(name, value, attrs='', checked=None): |
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
53 |
if checked is None: |
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
54 |
checked = value |
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
55 |
checked = checked and 'checked="checked"' or '' |
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
56 |
return u'<input type="checkbox" name="%s" value="%s" %s %s />' % ( |
b864288fd316
remove more 3.2 deprecated code, reintroduce checkbox used by formrenderers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
57 |
name, value, checked, attrs) |
1147 | 58 |
|
4313
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
59 |
def field_label(form, field): |
6082
57933567146f
[forms] callable field kwargs now always take form _and_ field parameters
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5940
diff
changeset
|
60 |
if callable(field.label): |
57933567146f
[forms] callable field kwargs now always take form _and_ field parameters
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5940
diff
changeset
|
61 |
return field.label(form, field) |
4313
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
62 |
# XXX with 3.6 we can now properly rely on 'if field.role is not None' and |
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
63 |
# stop having a tuple for label |
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
64 |
if isinstance(field.label, tuple): # i.e. needs contextual translation |
4314 | 65 |
return form._cw.pgettext(*field.label) |
66 |
return form._cw._(field.label) |
|
4313
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
67 |
|
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
68 |
|
1319 | 69 |
|
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2586
diff
changeset
|
70 |
class FormRenderer(AppObject): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
71 |
"""This is the 'default' renderer, displaying fields in a two columns table: |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
72 |
|
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
73 |
+--------------+--------------+ |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
74 |
| field1 label | field1 input | |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
75 |
+--------------+--------------+ |
5405
c03a9792e53a
[web/views] fix docstring
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
5389
diff
changeset
|
76 |
| field2 label | field2 input | |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
77 |
+--------------+--------------+ |
4743
026a89520184
[book] a few autoclasses for renderers, misc tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4668
diff
changeset
|
78 |
|
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
79 |
+---------+ |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
80 |
| buttons | |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
81 |
+---------+ |
1147 | 82 |
""" |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
83 |
__registry__ = 'formrenderers' |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
84 |
__regid__ = 'default' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
85 |
|
3478
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
86 |
_options = ('display_label', 'display_help', |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
87 |
'display_progress_div', 'table_class', 'button_bar_class', |
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
88 |
# add entity since it may be given to select the renderer |
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
89 |
'entity') |
1362
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
90 |
display_label = True |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
91 |
display_help = True |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
92 |
display_progress_div = True |
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:
1691
diff
changeset
|
93 |
table_class = u'attributeForm' |
1147 | 94 |
button_bar_class = u'formButtonBar' |
1436 | 95 |
|
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
96 |
def __init__(self, req=None, rset=None, row=None, col=None, **kwargs): |
2890
fdcb8a2bb6eb
fix __init__ parameters
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
97 |
super(FormRenderer, self).__init__(req, rset=rset, row=row, col=col) |
1362
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
98 |
if self._set_options(kwargs): |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
99 |
raise ValueError('unconsumed arguments %s' % kwargs) |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
100 |
|
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
101 |
def _set_options(self, kwargs): |
1434
42e57dbbc585
new display_relations_form option on EntityFormRender
sylvain.thenault@logilab.fr
parents:
1412
diff
changeset
|
102 |
for key in self._options: |
1362
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
103 |
try: |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
104 |
setattr(self, key, kwargs.pop(key)) |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
105 |
except KeyError: |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
106 |
continue |
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
107 |
return kwargs |
1436 | 108 |
|
1147 | 109 |
# renderer interface ###################################################### |
1436 | 110 |
|
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
111 |
def render(self, w, form, values): |
1362
decb7507fa91
nicer renderer options handling: can be passed to __init__ or to render
sylvain.thenault@logilab.fr
parents:
1340
diff
changeset
|
112 |
self._set_options(values) |
1147 | 113 |
form.add_media() |
6582
8eb7883b4223
[pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6575
diff
changeset
|
114 |
data = [] |
8eb7883b4223
[pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6575
diff
changeset
|
115 |
_w = data.append |
8eb7883b4223
[pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6575
diff
changeset
|
116 |
_w(self.open_form(form, values)) |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
117 |
self.render_content(_w, form, values) |
6582
8eb7883b4223
[pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6575
diff
changeset
|
118 |
_w(self.close_form(form, values)) |
1147 | 119 |
errormsg = self.error_message(form) |
120 |
if errormsg: |
|
1436 | 121 |
data.insert(0, errormsg) |
8445
594efcf51536
[formrenderers] if a tag object gets there, it blows (closes #2410462)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8425
diff
changeset
|
122 |
# NOTE: we call unicode because `tag` objects may be found within data |
594efcf51536
[formrenderers] if a tag object gets there, it blows (closes #2410462)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8425
diff
changeset
|
123 |
# e.g. from the cwtags library |
10696
4ba4be5553cf
[py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10666
diff
changeset
|
124 |
w(''.join(text_type(x) for x in data)) |
1147 | 125 |
|
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
126 |
def render_content(self, w, form, values): |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
127 |
if self.display_progress_div: |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
128 |
w(u'<div id="progress">%s</div>' % self._cw._('validating...')) |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
129 |
w(u'\n<fieldset>\n') |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
130 |
self.render_fields(w, form, values) |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
131 |
self.render_buttons(w, form) |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
132 |
w(u'\n</fieldset>\n') |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
133 |
|
1147 | 134 |
def render_label(self, form, field): |
2521
782360fa6cc0
take care to None labels
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2520
diff
changeset
|
135 |
if field.label is None: |
782360fa6cc0
take care to None labels
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2520
diff
changeset
|
136 |
return u'' |
4313
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
137 |
label = field_label(form, field) |
4156
1bbb0ee42c8e
drop form_field_name/form_field_id methods from form object, in favor of field.input_name(form) / field.dom_id(form)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
138 |
attrs = {'for': field.dom_id(form)} |
1147 | 139 |
if field.required: |
140 |
attrs['class'] = 'required' |
|
141 |
return tags.label(label, **attrs) |
|
142 |
||
143 |
def render_help(self, form, field): |
|
1946
d60ddfc4bb09
don't use tab
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1863
diff
changeset
|
144 |
help = [] |
1147 | 145 |
descr = field.help |
2093
e3aaf61f8c66
field's help may now be a callable taking the form as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2006
diff
changeset
|
146 |
if callable(descr): |
10006
8391bf718485
remove most 3.10 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9717
diff
changeset
|
147 |
descr = descr(form, field) |
1147 | 148 |
if descr: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
149 |
help.append('<div class="helper">%s</div>' % self._cw._(descr)) |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
150 |
example = field.example_format(self._cw) |
1147 | 151 |
if example: |
1863
9a02979a2c00
do not use <br> in widgets
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
1757
diff
changeset
|
152 |
help.append('<div class="helper">(%s: %s)</div>' |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
153 |
% (self._cw._('sample format'), example)) |
2996
866a2c135c33
B #345282 xhtml requires to use   instead of
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2656
diff
changeset
|
154 |
return u' '.join(help) |
1147 | 155 |
|
156 |
# specific methods (mostly to ease overriding) ############################# |
|
157 |
||
158 |
def error_message(self, form): |
|
159 |
"""return formatted error message |
|
160 |
||
161 |
This method should be called once inlined field errors has been consumed |
|
162 |
""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
163 |
req = self._cw |
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:
1691
diff
changeset
|
164 |
errex = form.form_valerror |
1147 | 165 |
# get extra errors |
166 |
if errex is not None: |
|
167 |
errormsg = req._('please correct the following errors:') |
|
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
168 |
errors = form.remaining_errors() |
1147 | 169 |
if errors: |
170 |
if len(errors) > 1: |
|
4783
6dc34d4cf892
[F] views: fix 2 unicode errors
Julien Jehannet <Julien Jehannet <julien.jehannet@logilab.fr>>
parents:
4743
diff
changeset
|
171 |
templstr = u'<li>%s</li>\n' |
1147 | 172 |
else: |
4783
6dc34d4cf892
[F] views: fix 2 unicode errors
Julien Jehannet <Julien Jehannet <julien.jehannet@logilab.fr>>
parents:
4743
diff
changeset
|
173 |
templstr = u' %s\n' |
1147 | 174 |
for field, err in errors: |
175 |
if field is None: |
|
176 |
errormsg += templstr % err |
|
177 |
else: |
|
178 |
errormsg += templstr % '%s: %s' % (req._(field), err) |
|
179 |
if len(errors) > 1: |
|
180 |
errormsg = '<ul>%s</ul>' % errormsg |
|
181 |
return u'<div class="errorMessage">%s</div>' % errormsg |
|
182 |
return u'' |
|
1436 | 183 |
|
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
184 |
def open_form(self, form, values, **attrs): |
4164
119a374c5eb4
form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4156
diff
changeset
|
185 |
if form.needs_multipart: |
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
186 |
enctype = u'multipart/form-data' |
1147 | 187 |
else: |
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
188 |
enctype = u'application/x-www-form-urlencoded' |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
189 |
attrs.setdefault('enctype', enctype) |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
190 |
attrs.setdefault('method', 'post') |
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
191 |
attrs.setdefault('action', form.form_action() or '#') |
1274
b730932a79b7
we don't want dom id systematically
sylvain.thenault@logilab.fr
parents:
1181
diff
changeset
|
192 |
if form.domid: |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
193 |
attrs.setdefault('id', form.domid) |
1147 | 194 |
if form.onsubmit: |
7582
dd4487c3f21e
[form, renderer] closes #1787234: [form] onsubmit interpolated by the form renderer, it shouldn't
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7581
diff
changeset
|
195 |
attrs.setdefault('onsubmit', form.onsubmit) |
1147 | 196 |
if form.cssstyle: |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
197 |
attrs.setdefault('style', form.cssstyle) |
1147 | 198 |
if form.cssclass: |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
199 |
attrs.setdefault('class', form.cssclass) |
1147 | 200 |
if form.cwtarget: |
10434
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
201 |
attrs.setdefault('target', form.cwtarget) |
9717
a6834e2dcc1b
[forms] Add autocomplete attribute for formrenderers
Alain Begey <alain@unlish.com>
parents:
8696
diff
changeset
|
202 |
if not form.autocomplete: |
a6834e2dcc1b
[forms] Add autocomplete attribute for formrenderers
Alain Begey <alain@unlish.com>
parents:
8696
diff
changeset
|
203 |
attrs.setdefault('autocomplete', 'off') |
7408
9ad9ce340c5f
[form rendering] some refactoring to ease FormRenderer overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6609
diff
changeset
|
204 |
return '<form %s>' % uilib.sgml_attributes(attrs) |
1436 | 205 |
|
4573
fc6bb020e60e
use a close_form method for consistency w/ open_form and allow overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4380
diff
changeset
|
206 |
def close_form(self, form, values): |
4743
026a89520184
[book] a few autoclasses for renderers, misc tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4668
diff
changeset
|
207 |
"""seems dumb but important for consistency w/ close form, and necessary |
4573
fc6bb020e60e
use a close_form method for consistency w/ open_form and allow overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4380
diff
changeset
|
208 |
for form renderers overriding open_form to use something else or more than |
fc6bb020e60e
use a close_form method for consistency w/ open_form and allow overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4380
diff
changeset
|
209 |
and <form> |
fc6bb020e60e
use a close_form method for consistency w/ open_form and allow overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4380
diff
changeset
|
210 |
""" |
10434
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
211 |
out = u'</form>' |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
212 |
if form.cwtarget: |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
213 |
attrs = {'name': form.cwtarget, 'id': form.cwtarget, |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
214 |
'width': '0px', 'height': '0px', |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
215 |
'src': 'javascript: void(0);'} |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
216 |
out = (u'<iframe %s></iframe>\n' % uilib.sgml_attributes(attrs)) + out |
8e04ab5582d9
[web/views/formrenderer] do not use `cubicweb:target` attribute on form (closes #5534074)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
10163
diff
changeset
|
217 |
return out |
4573
fc6bb020e60e
use a close_form method for consistency w/ open_form and allow overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4380
diff
changeset
|
218 |
|
1147 | 219 |
def render_fields(self, w, form, values): |
220 |
fields = self._render_hidden_fields(w, form) |
|
221 |
if fields: |
|
1403
425892e14e67
_render_fields don't need values argument
sylvain.thenault@logilab.fr
parents:
1401
diff
changeset
|
222 |
self._render_fields(fields, w, form) |
1147 | 223 |
self.render_child_forms(w, form, values) |
1436 | 224 |
|
1147 | 225 |
def render_child_forms(self, w, form, values): |
1436 | 226 |
# render |
1147 | 227 |
for childform in getattr(form, 'forms', []): |
228 |
self.render_fields(w, childform, values) |
|
229 |
||
230 |
def _render_hidden_fields(self, w, form): |
|
231 |
fields = form.fields[:] |
|
232 |
for field in form.fields: |
|
3478
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
233 |
if not field.is_visible(): |
1147 | 234 |
w(field.render(form, self)) |
6609
d73733479a3a
oops, use unicode
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6597
diff
changeset
|
235 |
w(u'\n') |
1147 | 236 |
fields.remove(field) |
237 |
return fields |
|
1436 | 238 |
|
1403
425892e14e67
_render_fields don't need values argument
sylvain.thenault@logilab.fr
parents:
1401
diff
changeset
|
239 |
def _render_fields(self, fields, w, form): |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
240 |
byfieldset = {} |
1147 | 241 |
for field in fields: |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
242 |
byfieldset.setdefault(field.fieldset, []).append(field) |
2574
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
243 |
if form.fieldsets_in_order: |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
244 |
fieldsets = form.fieldsets_in_order |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
245 |
else: |
10664
6465a3e9d7ac
[py3k] dict.iterkeys → dict
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10434
diff
changeset
|
246 |
fieldsets = byfieldset |
8696
0bb18407c053
[toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8445
diff
changeset
|
247 |
for fieldset in list(fieldsets): |
2574
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
248 |
try: |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
249 |
fields = byfieldset.pop(fieldset) |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
250 |
except KeyError: |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
251 |
self.warning('no such fieldset: %s (%s)', fieldset, form) |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
252 |
continue |
10163
4001cfe2f44d
[web/views] Stop mishandling the fieldset name in the default form renderer
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10006
diff
changeset
|
253 |
w(u'<fieldset>\n') |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
254 |
if fieldset: |
10163
4001cfe2f44d
[web/views] Stop mishandling the fieldset name in the default form renderer
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10006
diff
changeset
|
255 |
w(u'<legend>%s</legend>' % self._cw.__(fieldset)) |
6597
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
256 |
w(u'<table class="%s">\n' % self.table_class) |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
257 |
for field in fields: |
6597
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
258 |
w(u'<tr class="%s_%s_row">\n' % (field.name, field.role)) |
4277
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
259 |
if self.display_label and field.label is not None: |
6597
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
260 |
w(u'<th class="labelCol">%s</th>\n' % self.render_label(form, field)) |
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
261 |
w(u'<td') |
4277
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
262 |
if field.label is None: |
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
263 |
w(u' colspan="2"') |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
264 |
error = form.field_error(field) |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
265 |
if error: |
4277
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
266 |
w(u' class="error"') |
6597
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
267 |
w(u'>\n') |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
268 |
w(field.render(form, self)) |
6609
d73733479a3a
oops, use unicode
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6597
diff
changeset
|
269 |
w(u'\n') |
5038
90493551b1eb
[form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4936
diff
changeset
|
270 |
if error: |
90493551b1eb
[form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4936
diff
changeset
|
271 |
self.render_error(w, error) |
2520
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
272 |
if self.display_help: |
8c5cf48ae9ea
new fieldset attribute on field, use to group fields by the default form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2381
diff
changeset
|
273 |
w(self.render_help(form, field)) |
6597
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
274 |
w(u'</td></tr>\n') |
ba9fb496ad87
[test/renderer] fix html form/field generation & adapt a bit one test
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6582
diff
changeset
|
275 |
w(u'</table></fieldset>\n') |
2574
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
276 |
if byfieldset: |
37154aa90947
[form renderer] consider form.fieldsets_in_order if specified. Warn about unexistant or unused fieldsets.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2561
diff
changeset
|
277 |
self.warning('unused fieldsets: %s', ', '.join(byfieldset)) |
1147 | 278 |
|
279 |
def render_buttons(self, w, form): |
|
2148
2b2b9626a98f
do not write -invalid- empty table row when form has no buttons
Florent <florent@secondweb.fr>
parents:
2093
diff
changeset
|
280 |
if not form.form_buttons: |
2b2b9626a98f
do not write -invalid- empty table row when form has no buttons
Florent <florent@secondweb.fr>
parents:
2093
diff
changeset
|
281 |
return |
1147 | 282 |
w(u'<table class="%s">\n<tr>\n' % self.button_bar_class) |
1304 | 283 |
for button in form.form_buttons: |
284 |
w(u'<td>%s</td>\n' % button.render(form)) |
|
1147 | 285 |
w(u'</tr></table>') |
286 |
||
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
287 |
def render_error(self, w, err): |
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
288 |
"""return validation error for widget's field, if any""" |
5038
90493551b1eb
[form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4936
diff
changeset
|
289 |
w(u'<span class="errorMsg">%s</span>' % err) |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
290 |
|
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
291 |
|
1147 | 292 |
|
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
|
293 |
class BaseFormRenderer(FormRenderer): |
2198
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
294 |
"""use form_renderer_id = 'base' if you want base FormRenderer layout even |
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
295 |
when selected for an entity |
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
|
296 |
""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
297 |
__regid__ = 'base' |
2198
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
298 |
|
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
299 |
|
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
300 |
|
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
301 |
class HTableFormRenderer(FormRenderer): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
302 |
"""The 'htable' form renderer display fields horizontally in a table: |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
303 |
|
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
304 |
+--------------+--------------+---------+ |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
305 |
| field1 label | field2 label | | |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
306 |
+--------------+--------------+---------+ |
4936
a4b772a0d801
Fixed some of the documentation warnings when building the book with sphinx.
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
4783
diff
changeset
|
307 |
| field1 input | field2 input | buttons | |
1436 | 308 |
+--------------+--------------+---------+ |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
309 |
""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
310 |
__regid__ = 'htable' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
311 |
|
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
312 |
display_help = False |
1403
425892e14e67
_render_fields don't need values argument
sylvain.thenault@logilab.fr
parents:
1401
diff
changeset
|
313 |
def _render_fields(self, fields, w, form): |
3572
606ce53dc557
[forms] some style for htable renderer layout
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3519
diff
changeset
|
314 |
w(u'<table border="0" class="htableForm">') |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
315 |
w(u'<tr>') |
1436 | 316 |
for field in fields: |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
317 |
if self.display_label: |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
318 |
w(u'<th class="labelCol">%s</th>' % self.render_label(form, field)) |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
319 |
if self.display_help: |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
320 |
w(self.render_help(form, field)) |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
321 |
# empty slot for buttons |
2996
866a2c135c33
B #345282 xhtml requires to use   instead of
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2656
diff
changeset
|
322 |
w(u'<th class="labelCol"> </th>') |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
323 |
w(u'</tr>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
324 |
w(u'<tr>') |
1436 | 325 |
for field in fields: |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
326 |
error = form.field_error(field) |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
327 |
if error: |
1757 | 328 |
w(u'<td class="error">') |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
329 |
self.render_error(w, error) |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
330 |
else: |
1757 | 331 |
w(u'<td>') |
1401
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
332 |
w(field.render(form, self)) |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
333 |
w(u'</td>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
334 |
w(u'<td>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
335 |
for button in form.form_buttons: |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
336 |
w(button.render(form)) |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
337 |
w(u'</td>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
338 |
w(u'</tr>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
339 |
w(u'</table>') |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
340 |
|
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
341 |
def render_buttons(self, w, form): |
56764b1b4887
new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents:
1362
diff
changeset
|
342 |
pass |
1436 | 343 |
|
344 |
||
7581
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
345 |
class OneRowTableFormRenderer(FormRenderer): |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
346 |
"""The 'htable' form renderer display fields horizontally in a table: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
347 |
|
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
348 |
+--------------+--------------+--------------+--------------+---------+ |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
349 |
| field1 label | field1 input | field2 label | field2 input | buttons | |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
350 |
+--------------+--------------+--------------+--------------+---------+ |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
351 |
""" |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
352 |
__regid__ = 'onerowtable' |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
353 |
|
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
354 |
display_help = False |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
355 |
def _render_fields(self, fields, w, form): |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
356 |
w(u'<table border="0" class="oneRowTableForm">') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
357 |
w(u'<tr>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
358 |
for field in fields: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
359 |
if self.display_label: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
360 |
w(u'<th class="labelCol">%s</th>' % self.render_label(form, field)) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
361 |
if self.display_help: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
362 |
w(self.render_help(form, field)) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
363 |
error = form.field_error(field) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
364 |
if error: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
365 |
w(u'<td class="error">') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
366 |
self.render_error(w, error) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
367 |
else: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
368 |
w(u'<td>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
369 |
w(field.render(form, self)) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
370 |
w(u'</td>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
371 |
w(u'<td>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
372 |
for button in form.form_buttons: |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
373 |
w(button.render(form)) |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
374 |
w(u'</td>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
375 |
w(u'</tr>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
376 |
w(u'</table>') |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
377 |
|
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
378 |
def render_buttons(self, w, form): |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
379 |
pass |
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
380 |
|
bf9f8fa7e5dc
[form renderers]Â closes #1787232: new 'onerowtable' form renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7411
diff
changeset
|
381 |
|
1147 | 382 |
class EntityCompositeFormRenderer(FormRenderer): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
383 |
"""This is a specific renderer for the multiple entities edition form |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
384 |
('muledit'). |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
385 |
|
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
386 |
Each entity form will be displayed in row off a table, with a check box for |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
387 |
each entities to indicate which ones are edited. Those checkboxes should be |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
388 |
automatically updated when something is edited. |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
389 |
""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
390 |
__regid__ = 'composite' |
1436 | 391 |
|
2575
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
392 |
_main_display_fields = None |
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
393 |
|
1147 | 394 |
def render_fields(self, w, form, values): |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3510
diff
changeset
|
395 |
if form.parent_form is None: |
1147 | 396 |
w(u'<table class="listing">') |
6357
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
397 |
# get fields from the first subform with something to display (we |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
398 |
# may have subforms with nothing editable that will simply be |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
399 |
# skipped later) |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
400 |
for subform in form.forms: |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
401 |
subfields = [field for field in subform.fields |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
402 |
if field.is_visible()] |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
403 |
if subfields: |
2d277c67f103
[muledit] form may contains subforms with nothing editable that will be s kipped, so ensure we choose one with something to display when rendering table headers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
404 |
break |
2586
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
405 |
if subfields: |
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
406 |
# main form, display table headers |
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
407 |
w(u'<tr class="header">') |
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
408 |
w(u'<th align="left">%s</th>' % |
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
409 |
tags.input(type='checkbox', |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
410 |
title=self._cw._('toggle check boxes'), |
5658
7b9553a9db65
[ajax] refactor/cleanup low-level ajax functions
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5588
diff
changeset
|
411 |
onclick="setCheckboxesState('eid', null, this.checked)")) |
2586
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
412 |
for field in subfields: |
4313
5d8196a105a7
move base form renderer label handling into a function to reuse it in CompositeFormRenderer and avoid seeing a tuple in column headers...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
413 |
w(u'<th>%s</th>' % field_label(form, field)) |
2586
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
414 |
w(u'</tr>') |
1147 | 415 |
super(EntityCompositeFormRenderer, self).render_fields(w, form, values) |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3510
diff
changeset
|
416 |
if form.parent_form is None: |
1147 | 417 |
w(u'</table>') |
2575
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
418 |
if self._main_display_fields: |
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
419 |
super(EntityCompositeFormRenderer, self)._render_fields( |
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
420 |
self._main_display_fields, w, form) |
1436 | 421 |
|
1403
425892e14e67
_render_fields don't need values argument
sylvain.thenault@logilab.fr
parents:
1401
diff
changeset
|
422 |
def _render_fields(self, fields, w, form): |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3510
diff
changeset
|
423 |
if form.parent_form is not None: |
1147 | 424 |
entity = form.edited_entity |
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:
1691
diff
changeset
|
425 |
values = form.form_previous_values |
1147 | 426 |
qeid = eid_param('eid', entity.eid) |
5658
7b9553a9db65
[ajax] refactor/cleanup low-level ajax functions
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5588
diff
changeset
|
427 |
cbsetstate = "setCheckboxesState('eid', %s, 'checked')" % \ |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
428 |
xml_escape(json_dumps(entity.eid)) |
3467
a6405235aac6
[tests] make unittest_views_editforms pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3451
diff
changeset
|
429 |
w(u'<tr class="%s">' % (entity.cw_row % 2 and u'even' or u'odd')) |
1147 | 430 |
# XXX turn this into a widget used on the eid field |
2577 | 431 |
w(u'<td>%s</td>' % checkbox('eid', entity.eid, |
432 |
checked=qeid in values)) |
|
1147 | 433 |
for field in fields: |
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
434 |
error = form.field_error(field) |
1147 | 435 |
if error: |
436 |
w(u'<td class="error">') |
|
4224
5998df006968
refactor form error handling:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
437 |
self.render_error(w, error) |
1147 | 438 |
else: |
439 |
w(u'<td>') |
|
2577 | 440 |
if isinstance(field.widget, (fwdgs.Select, fwdgs.CheckBox, |
441 |
fwdgs.Radio)): |
|
1147 | 442 |
field.widget.attrs['onchange'] = cbsetstate |
443 |
elif isinstance(field.widget, fwdgs.Input): |
|
444 |
field.widget.attrs['onkeypress'] = cbsetstate |
|
2577 | 445 |
# XXX else |
1147 | 446 |
w(u'<div>%s</div>' % field.render(form, self)) |
2586
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
447 |
w(u'</td>\n') |
879912fe94e1
[xhtml form renderer] fix html structure, move header where we are sure to display it when necesary (_render_fields not displayed if main form has no visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2577
diff
changeset
|
448 |
w(u'</tr>') |
1147 | 449 |
else: |
2575
e033939d5664
[form renderer] fix composite form renderer in case the main form has some visible fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2574
diff
changeset
|
450 |
self._main_display_fields = fields |
1436 | 451 |
|
452 |
||
3478
f043f71017a3
handle display_fields in the form, not in the renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3477
diff
changeset
|
453 |
class EntityFormRenderer(BaseFormRenderer): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
454 |
"""This is the 'default' renderer for entity's form. |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
455 |
|
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
456 |
You can still use form_renderer_id = 'base' if you want base FormRenderer |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
457 |
layout even when selected for an entity. |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
458 |
""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
459 |
__regid__ = 'default' |
2198
ac45d4dbaf76
close #344264, pb with composite fields / renderer.display_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2148
diff
changeset
|
460 |
# needs some additional points in some case (XXX explain cases) |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5849
diff
changeset
|
461 |
__select__ = is_instance('Any') & yes() |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
462 |
|
4293
0c4bdb3d93fd
delete remaining stuff w/ handling of the generic relations
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4278
diff
changeset
|
463 |
_options = FormRenderer._options + ('main_form_title',) |
3592
4c08780e54ed
[i18n] msgid tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3572
diff
changeset
|
464 |
main_form_title = _('main informations') |
1436 | 465 |
|
1147 | 466 |
def open_form(self, form, values): |
3507
ff945c7013d9
[form] make EntityFormRenderer a little bit easier to override
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
3360
diff
changeset
|
467 |
attrs_fs_label = '' |
ff945c7013d9
[form] make EntityFormRenderer a little bit easier to override
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
3360
diff
changeset
|
468 |
if self.main_form_title: |
ff945c7013d9
[form] make EntityFormRenderer a little bit easier to override
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
3360
diff
changeset
|
469 |
attrs_fs_label += ('<div class="iformTitle"><span>%s</span></div>' |
4073
03681ba6da0b
cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
4023
diff
changeset
|
470 |
% self._cw._(self.main_form_title)) |
1147 | 471 |
attrs_fs_label += '<div class="formBody">' |
1181
620ec8e6ae19
cleanup, various fix to get something working
sylvain.thenault@logilab.fr
parents:
1147
diff
changeset
|
472 |
return attrs_fs_label + super(EntityFormRenderer, self).open_form(form, values) |
1147 | 473 |
|
5830
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
474 |
def close_form(self, form, values): |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
475 |
"""seems dumb but important for consistency w/ close form, and necessary |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
476 |
for form renderers overriding open_form to use something else or more than |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
477 |
and <form> |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
478 |
""" |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
479 |
return super(EntityFormRenderer, self).close_form(form, values) + '</div>' |
23ea56123670
EntityFormRenderer redefine open_form and add a div section, so redefine close_form to add the closing div tag
Stéphanie Marcu <steph@logilab.fr>
parents:
5829
diff
changeset
|
480 |
|
1147 | 481 |
def render_buttons(self, w, form): |
1304 | 482 |
if len(form.form_buttons) == 3: |
1147 | 483 |
w("""<table width="100%%"> |
484 |
<tbody> |
|
485 |
<tr><td align="center"> |
|
486 |
%s |
|
487 |
</td><td style="align: right; width: 50%%;"> |
|
488 |
%s |
|
489 |
%s |
|
490 |
</td></tr> |
|
491 |
</tbody> |
|
1304 | 492 |
</table>""" % tuple(button.render(form) for button in form.form_buttons)) |
1147 | 493 |
else: |
494 |
super(EntityFormRenderer, self).render_buttons(w, form) |
|
495 |
||
1436 | 496 |
|
1147 | 497 |
class EntityInlinedFormRenderer(EntityFormRenderer): |
5368
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
498 |
"""This is a specific renderer for entity's form inlined into another |
d321e4b62a10
[book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5038
diff
changeset
|
499 |
entity's form. |
1147 | 500 |
""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
501 |
__regid__ = 'inline' |
8340
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
502 |
fieldset_css_class = 'subentity' |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
503 |
|
8413
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
504 |
def render_title(self, w, form, values): |
8425 | 505 |
w(u'<div class="iformTitle">') |
8413
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
506 |
w(u'<span>%(title)s</span> ' |
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
507 |
'#<span class="icounter">%(counter)s</span> ' % values) |
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
508 |
if values['removejs']: |
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
509 |
values['removemsg'] = self._cw._('remove-inlined-entity-form') |
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
510 |
w(u'[<a href="javascript: %(removejs)s;$.noop();">%(removemsg)s</a>]' |
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
511 |
% values) |
8425 | 512 |
w(u'</div>') |
8413
9ac36a6ec07e
[formrenderers] Factor-out render_title to ease customisation in derived classes
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7582
diff
changeset
|
513 |
|
6453
7fdd780d87e4
[form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6366
diff
changeset
|
514 |
def render(self, w, form, values): |
1147 | 515 |
form.add_media() |
8340
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
516 |
self.open_form(w, form, values) |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
517 |
self.render_title(w, form, values) |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
518 |
# XXX that stinks |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
519 |
# cleanup values |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
520 |
for key in ('title', 'removejs', 'removemsg'): |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
521 |
values.pop(key, None) |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
522 |
self.render_fields(w, form, values) |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
523 |
self.close_form(w, form, values) |
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
524 |
|
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
525 |
def open_form(self, w, form, values): |
1147 | 526 |
try: |
527 |
w(u'<div id="div-%(divid)s" onclick="%(divonclick)s">' % values) |
|
528 |
except KeyError: |
|
529 |
w(u'<div id="div-%(divid)s">' % values) |
|
530 |
else: |
|
531 |
w(u'<div id="notice-%s" class="notice">%s</div>' % ( |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3398
diff
changeset
|
532 |
values['divid'], self._cw._('click on the box to cancel the deletion'))) |
1147 | 533 |
w(u'<div class="iformBody">') |
8340
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
534 |
|
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
535 |
def close_form(self, w, form, values): |
1293 | 536 |
w(u'</div></div>') |
1436 | 537 |
|
1147 | 538 |
def render_fields(self, w, form, values): |
539 |
w(u'<fieldset id="fs-%(divid)s">' % values) |
|
540 |
fields = self._render_hidden_fields(w, form) |
|
541 |
w(u'</fieldset>') |
|
8340
622fcca4fe00
[form renderer] refactor inline form renderer to ease overriding. Closes #2282662
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8190
diff
changeset
|
542 |
w(u'<fieldset class="%s">' % self.fieldset_css_class) |
1147 | 543 |
if fields: |
1403
425892e14e67
_render_fields don't need values argument
sylvain.thenault@logilab.fr
parents:
1401
diff
changeset
|
544 |
self._render_fields(fields, w, form) |
1147 | 545 |
self.render_child_forms(w, form, values) |
546 |
w(u'</fieldset>') |