cubicweb/web/views/formrenderers.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Thu, 21 Mar 2019 14:33:54 +0100
changeset 12530 9d88e1177c35
parent 12204 95e0883e2375
child 12567 26744ad37953
permissions -rw-r--r--
Remove Twisted web server Twisted web server is not used anymore and has been superseded by pyramid many years ago. Furthermore, our usage is not compatible with Python 3. So we drop the "etwist" sub-package. As a consequence, "all-in-one" configuration type gets dropped as it was Twisted-specific. We resurrect it in cubicweb/pyramid/config.py by only keeping options used by the "pyramid". Similarly, we introduce a AllInOneCreateHandler in cubicweb/pyramid/pyramidctl.py that is basically the one that lived in cubicweb/etwist/twctl.py and is used to create the "all-in-one" instance. Added a TODO here about "pyramid.ini" that could be generated at the end of bootstrap() method. In cubicweb/devtools/httptest.py, CubicWebServerTC is now equivalent to CubicWebWsgiTC and the latter is dropped.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11207
diff changeset
    35
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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4293 4313
diff changeset
    65
        return form._cw.pgettext(*field.label)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4293 4313
diff changeset
    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
sylvain.thenault@logilab.fr
parents: 1305
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
    94
    button_bar_class = u'formButtonBar'
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
    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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   108
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   109
    # renderer interface ######################################################
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   119
        errormsg = self.error_message(form)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   120
        if errormsg:
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   139
        if field.required:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   140
            attrs['class'] = 'required'
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   141
        return tags.label(label, **attrs)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   142
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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 &#160; instead of &nbsp;
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2656
diff changeset
   154
        return u'&#160;'.join(help)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   155
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   156
    # specific methods (mostly to ease overriding) #############################
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   157
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   158
    def error_message(self, form):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   159
        """return formatted error message
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   160
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   161
        This method should be called once inlined field errors has been consumed
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   165
        # get extra errors
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   166
        if errex is not None:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   169
            if errors:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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'&#160;%s\n'
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   174
                for field, err in errors:
12204
95e0883e2375 [web/form] Relax condition for non-translating field names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   175
                    if not field:
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   176
                        errormsg += templstr % err
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   177
                    else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   178
                        errormsg += templstr % '%s: %s' % (req._(field), err)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   179
                if len(errors) > 1:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   180
                    errormsg = '<ul>%s</ul>' % errormsg
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   181
            return u'<div class="errorMessage">%s</div>' % errormsg
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   182
        return u''
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   219
    def render_fields(self, w, form, values):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   220
        fields = self._render_hidden_fields(w, form)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   223
        self.render_child_forms(w, form, values)
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   224
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   225
    def render_child_forms(self, w, form, values):
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   226
        # render
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   227
        for childform in getattr(form, 'forms', []):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   228
            self.render_fields(w, childform, values)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   229
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   230
    def _render_hidden_fields(self, w, form):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   231
        fields = form.fields[:]
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   236
                fields.remove(field)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   237
        return fields
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   278
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   282
        w(u'<table class="%s">\n<tr>\n' % self.button_bar_class)
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1293
diff changeset
   283
        for button in form.form_buttons:
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1293
diff changeset
   284
            w(u'<td>%s</td>\n' % button.render(form))
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   285
        w(u'</tr></table>')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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">')
11207
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   315
        if self.display_label:
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   316
            w(u'<tr>')
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   317
            for field in fields:
1401
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))
11207
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   319
                if self.display_help:
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   320
                    w(self.render_help(form, field))
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   321
            # empty slot for buttons
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   322
            w(u'<th class="labelCol">&#160;</th>')
d7c7423f4ea6 [forms] Fix HTableFormRenderer _render_fields method behavior when display_label is False.
Vladimir Popescu <vladimir.popescu@logilab.fr>
parents: 11057
diff changeset
   323
            w(u'</tr>')
1401
56764b1b4887 new renderer displaying field in an horizontable table
sylvain.thenault@logilab.fr
parents: 1362
diff changeset
   324
        w(u'<tr>')
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
fbb9928bf4f1 remove fixed width
sylvain.thenault@logilab.fr
parents: 1710
diff changeset
   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
fbb9928bf4f1 remove fixed width
sylvain.thenault@logilab.fr
parents: 1710
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   343
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   430
            # XXX turn this into a widget used on the eid field
2577
7c9888114085 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2575
diff changeset
   431
            w(u'<td>%s</td>' % checkbox('eid', entity.eid,
7c9888114085 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2575
diff changeset
   432
                                        checked=qeid in values))
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   435
                if error:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   438
                else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   439
                    w(u'<td>')
2577
7c9888114085 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2575
diff changeset
   440
                if isinstance(field.widget, (fwdgs.Select, fwdgs.CheckBox,
7c9888114085 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2575
diff changeset
   441
                                             fwdgs.Radio)):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   442
                    field.widget.attrs['onchange'] = cbsetstate
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   443
                elif isinstance(field.widget, fwdgs.Input):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   444
                    field.widget.attrs['onkeypress'] = cbsetstate
2577
7c9888114085 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2575
diff changeset
   445
                # XXX else
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   451
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   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
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   465
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   481
    def render_buttons(self, w, form):
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1293
diff changeset
   482
        if len(form.form_buttons) == 3:
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   483
            w("""<table width="100%%">
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   484
  <tbody>
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   485
   <tr><td align="center">
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   486
     %s
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   487
   </td><td style="align: right; width: 50%%;">
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   488
     %s
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   489
     %s
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   490
   </td></tr>
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   491
  </tbody>
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1293
diff changeset
   492
 </table>""" % tuple(button.render(form) for button in form.form_buttons))
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   493
        else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   494
            super(EntityFormRenderer, self).render_buttons(w, form)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   495
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   496
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
b86bdc343c18 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8340 8413
diff changeset
   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
b86bdc343c18 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8340 8413
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   526
        try:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   527
            w(u'<div id="div-%(divid)s" onclick="%(divonclick)s">' % values)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   528
        except KeyError:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   529
            w(u'<div id="div-%(divid)s">' % values)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   530
        else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
aae1516b6426 missing closing div
sylvain.thenault@logilab.fr
parents: 1292
diff changeset
   536
        w(u'</div></div>')
1436
97774eb6443b delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1434
diff changeset
   537
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   538
    def render_fields(self, w, form, values):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   539
        w(u'<fieldset id="fs-%(divid)s">' % values)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   540
        fields = self._render_hidden_fields(w, form)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   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
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   545
        self.render_child_forms(w, form, values)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents:
diff changeset
   546
        w(u'</fieldset>')