web/views/forms.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Wed, 21 Apr 2010 16:53:47 +0200
branchstable
changeset 5368 d321e4b62a10
parent 5367 4176a50c81c9
child 5421 8167de96c523
permissions -rw-r--r--
[book] start documenting the HTML form system
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     1
# organization: Logilab
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     2
# copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     3
# contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     4
# license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     5
"""
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     6
Base form classes
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     7
-----------------
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     8
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
     9
.. Note:
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    10
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    11
   Form is the glue that bind a context to a set of fields, and is rendered
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    12
   using a form renderer. No display is actually done here, though you'll find
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    13
   some attributes of form that are used to control the rendering process.
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    14
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    15
Besides the automagic form we'll see later, they are barely two form
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    16
classes in |cubicweb|:
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    17
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    18
.. autoclass:: cubicweb.web.views.forms.FieldsForm
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    19
.. autoclass:: cubicweb.web.views.forms.EntityFieldsForm
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    20
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    21
As you have probably guessed, choosing between them is easy. Simply ask you the
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    22
question 'I am editing an entity or not?'. If the answer is yes, use
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    23
:class:`EntityFieldsForm`, else use :class:`FieldsForm`.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    24
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    25
Actually there exists a third form class:
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    26
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    27
.. autoclass:: cubicweb.web.views.forms.CompositeForm
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    28
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    29
but you'll use this one rarely.
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    30
"""
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    31
__docformat__ = "restructuredtext en"
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    32
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    33
from warnings import warn
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    34
4236
9260403bfe0b move autoform's field_by_name implementation on base EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4224
diff changeset
    35
from logilab.common.decorators import iclassmethod
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    36
from logilab.common.compat import any
3953
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
    37
from logilab.common.deprecation import deprecated
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    38
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
    39
from cubicweb import typed_eid
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    40
from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset
4236
9260403bfe0b move autoform's field_by_name implementation on base EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4224
diff changeset
    41
from cubicweb.web import uicfg, form, formwidgets as fwdgs
5367
4176a50c81c9 [form] small api cleanup and refactoring before documenting the form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
    42
from cubicweb.web.formfields import relvoc_unrelated, guess_field
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    43
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    44
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    45
class FieldsForm(form.Form):
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    46
    """This is the base class for fields based forms.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    47
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    48
    **Attributes**
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    49
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    50
    The following attributes may be either set on subclasses or given on
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    51
    form selection to customize the generated form:
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    52
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    53
    :attr:`needs_js`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    54
      sequence of javascript files that should be added to handle this form
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    55
      (through :meth:`~cubicweb.web.request.Request.add_js`)
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    56
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    57
    :attr:`needs_css`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    58
      sequence of css files that should be added to handle this form (through
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    59
      :meth:`~cubicweb.web.request.Request.add_css`)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    60
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    61
    :attr:`domid`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    62
      value for the "id" attribute of the <form> tag
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    63
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    64
    :attr:`action`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    65
      value for the "action" attribute of the <form> tag
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    66
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    67
    :attr:`onsubmit`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    68
      value for the "onsubmit" attribute of the <form> tag
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    69
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    70
    :attr:`cssclass`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    71
      value for the "class" attribute of the <form> tag
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    72
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    73
    :attr:`cssstyle`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    74
      value for the "style" attribute of the <form> tag
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    75
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    76
    :attr:`cwtarget`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    77
      value for the "cubicweb:target" attribute of the <form> tag
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    78
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    79
    :attr:`redirect_path`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    80
      relative to redirect to after submitting the form
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    81
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    82
    :attr:`copy_nav_params`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    83
      flag telling if navigation parameters should be copied back in hidden
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    84
      inputs
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    85
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    86
    :attr:`form_buttons`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    87
      sequence of form control (:class:`~cubicweb.web.formwidgets.Button`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    88
      widgets instances)
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    89
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    90
    :attr:`form_renderer_id`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    91
      identifier of the form renderer to use to render the form
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    92
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    93
    :attr:`fieldsets_in_order`
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    94
      sequence of fieldset names , to control order
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    95
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    96
    **Generic methods**
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
    97
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    98
    .. automethod:: cubicweb.web.form.Form.field_by_name(name, role=None)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
    99
    .. automethod:: cubicweb.web.form.Form.fields_by_name(name, role=None)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   100
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   101
    **Form construction methods**
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   102
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   103
    .. automethod:: cubicweb.web.form.Form.remove_field(field)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   104
    .. automethod:: cubicweb.web.form.Form.append_field(field)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   105
    .. automethod:: cubicweb.web.form.Form.insert_field_before(field, name, role=None)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   106
    .. automethod:: cubicweb.web.form.Form.insert_field_after(field, name, role=None)
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   107
    .. automethod:: cubicweb.web.form.Form.add_hidden(name, value=None, **kwargs)
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   108
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   109
    **Form rendering methods**
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   110
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   111
    .. automethod:: cubicweb.web.views.forms.FieldsForm.render
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   112
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   113
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   114
    __regid__ = 'base'
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   115
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   116
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   117
    # attributes overrideable by subclasses or through __init__
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   118
    needs_js = ('cubicweb.ajax.js', 'cubicweb.edition.js',)
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   119
    needs_css = ('cubicweb.form.css',)
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   120
    action = None
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   121
    onsubmit = "return freezeFormButtons('%(domid)s');"
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   122
    cssclass = None
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   123
    cssstyle = None
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   124
    cwtarget = None
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   125
    redirect_path = None
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   126
    form_buttons = None
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   127
    form_renderer_id = 'default'
2573
9c414dbc76da add default values for fielsets_in_order, document base form attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2293
diff changeset
   128
    fieldsets_in_order = None
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   129
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   130
    @property
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   131
    def needs_multipart(self):
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   132
        """true if the form needs enctype=multipart/form-data"""
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   133
        return any(field.needs_multipart for field in self.fields)
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   134
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   135
    def add_media(self):
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   136
        """adds media (CSS & JS) required by this widget"""
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   137
        if self.needs_js:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   138
            self._cw.add_js(self.needs_js)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   139
        if self.needs_css:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   140
            self._cw.add_css(self.needs_css)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   141
4167
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   142
    def render(self, formvalues=None, rendervalues=None, renderer=None, **kwargs):
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   143
        """Render this form, using the `renderer` given as argument or the
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   144
        default according to :attr:`form_renderer_id`. The rendered form is
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   145
        returned as an unicode string.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   146
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   147
        `formvalues` is an optional dictionary containing values that will be
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   148
        considered as field's value.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   149
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   150
        Extra keyword arguments will be given to renderer's :meth:`render` method.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   151
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   152
        `rendervalues` is deprecated.
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   153
        """
4167
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   154
        if rendervalues is not None:
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   155
            warn('[3.6] rendervalues argument is deprecated, all named arguments will be given instead',
4284
8e5dcb54fd8e fix warning stack level
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4260
diff changeset
   156
                 DeprecationWarning, stacklevel=2)
4167
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   157
            kwargs = rendervalues
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   158
        self.build_context(formvalues)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   159
        if renderer is None:
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   160
            renderer = self.default_renderer()
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   161
        return renderer.render(self, kwargs)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   162
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   163
    def default_renderer(self):
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   164
        return self._cw.vreg['formrenderers'].select(
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   165
            self.form_renderer_id, self._cw,
4697
b8263d717e74 [web] fix muledit rendering bug
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4668
diff changeset
   166
            rset=self.cw_rset, row=self.cw_row, col=self.cw_col or 0)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   167
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   168
    formvalues = None
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   169
    def build_context(self, formvalues=None):
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   170
        """build form context values (the .context attribute which is a
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   171
        dictionary with field instance as key associated to a dictionary
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   172
        containing field 'name' (qualified), 'id', 'value' (for display, always
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   173
        a string).
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   174
        """
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   175
        if self.formvalues is not None:
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   176
            return # already built
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   177
        self.formvalues = formvalues or {}
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   178
        # use a copy in case fields are modified while context is build (eg
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   179
        # __linkto handling for instance)
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   180
        for field in self.fields[:]:
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   181
            for field in field.actual_fields(self):
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   182
                field.form_init(self)
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   183
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   184
    @deprecated('[3.6] use .add_hidden(name, value, **kwargs)')
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   185
    def form_add_hidden(self, name, value=None, **kwargs):
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   186
        return self.add_hidden(name, value, **kwargs)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   187
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   188
    @deprecated('[3.6] use .render(formvalues, **rendervalues)')
3953
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   189
    def form_render(self, **values):
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   190
        """render this form, using the renderer given in args or the default
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   191
        FormRenderer()
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   192
        """
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   193
        self.build_context(values)
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   194
        renderer = values.pop('renderer', None)
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   195
        if renderer is None:
4260
832b578839cb [forms] fix implementation of backward compat method form_render
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4257
diff changeset
   196
            renderer = self.default_renderer()
3953
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   197
        return renderer.render(self, values)
19aefd78f61b [forms] deprecate form_render(**kwargs) in favor of render(formvalues=None, rendervalues=None, renderer=None)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3923
diff changeset
   198
4660
21ed77792c33 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4659
diff changeset
   199
4236
9260403bfe0b move autoform's field_by_name implementation on base EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4224
diff changeset
   200
_AFF = uicfg.autoform_field
9260403bfe0b move autoform's field_by_name implementation on base EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4224
diff changeset
   201
_AFF_KWARGS = uicfg.autoform_field_kwargs
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   202
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   203
class EntityFieldsForm(FieldsForm):
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   204
    """This class is designed for forms used to edit some entities. It should
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   205
    handle for you all the underlying stuff necessary to properly work with the
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   206
    generic :class:`~cubicweb.web.views.editcontroller.EditController`.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   207
    """
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   208
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   209
    __regid__ = 'base'
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
   210
    __select__ = (match_kwargs('entity')
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
   211
                  | (one_line_rset() & non_final_entity()))
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   212
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   213
    internal_fields = FieldsForm.internal_fields + ('__type', 'eid', '__maineid')
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   214
    domid = 'entityForm'
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   215
4257
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   216
    @iclassmethod
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   217
    def field_by_name(cls_or_self, name, role=None, eschema=None):
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   218
        """return field with the given name and role. If field is not explicitly
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   219
        defined for the form but `eclass` is specified, guess_field will be
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   220
        called.
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   221
        """
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   222
        try:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   223
            return super(EntityFieldsForm, cls_or_self).field_by_name(name, role)
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   224
        except form.FieldNotFound:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   225
            if eschema is None or role is None or not name in eschema.schema:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   226
                raise
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   227
            rschema = eschema.schema.rschema(name)
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   228
            # XXX use a sample target type. Document this.
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   229
            tschemas = rschema.targets(eschema, role)
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   230
            fieldcls = _AFF.etype_get(eschema, rschema, role, tschemas[0])
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   231
            kwargs = _AFF_KWARGS.etype_get(eschema, rschema, role, tschemas[0])
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   232
            if kwargs is None:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   233
                kwargs = {}
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   234
            if fieldcls:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   235
                if not isinstance(fieldcls, type):
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   236
                    return fieldcls # already and instance
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   237
                return fieldcls(name=name, role=role, eidparam=True, **kwargs)
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   238
            field = guess_field(eschema, rschema, role, eidparam=True, **kwargs)
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   239
            if field is None:
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   240
                raise
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   241
            return field
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   242
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   243
    def __init__(self, _cw, rset=None, row=None, col=None, **kwargs):
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   244
        try:
4206
cebdf8ee5ad7 [forms] edited_entity must be set before calling session_key()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4134
diff changeset
   245
            self.edited_entity = kwargs.pop('entity')
4257
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   246
        except KeyError:
4252
6c4f109c2b03 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4248 4212
diff changeset
   247
            self.edited_entity = rset.complete_entity(row or 0, col or 0)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   248
        msg = kwargs.pop('submitmsg', None)
4257
0a9b38a492e1 fix bad merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   249
        super(EntityFieldsForm, self).__init__(_cw, rset, row, col, **kwargs)
4659
f8326ff98f37 [form] complete 25de2eb0432b by ignore req parameters by default for all hidden fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4658
diff changeset
   250
        self.add_hidden('__type', self.edited_entity.__regid__, eidparam=True)
f8326ff98f37 [form] complete 25de2eb0432b by ignore req parameters by default for all hidden fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4658
diff changeset
   251
        self.add_hidden('eid', self.edited_entity.eid)
2080
3ea388b5b9d8 oops, mainform default to True
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2050
diff changeset
   252
        if kwargs.get('mainform', True): # mainform default to true in parent
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   253
            self.add_hidden(u'__maineid', self.edited_entity.eid)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   254
            # If we need to directly attach the new object to another one
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   255
            if self._cw.list_form_param('__linkto'):
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   256
                for linkto in self._cw.list_form_param('__linkto'):
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   257
                    self.add_hidden('__linkto', linkto)
2050
ce184fdb1e56 fix submit message handling in entity form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2049
diff changeset
   258
                if msg:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   259
                    msg = '%s %s' % (msg, self._cw._('and linked'))
2050
ce184fdb1e56 fix submit message handling in entity form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2049
diff changeset
   260
                else:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   261
                    msg = self._cw._('entity linked')
2050
ce184fdb1e56 fix submit message handling in entity form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2049
diff changeset
   262
        if msg:
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   263
            self.add_hidden('__message', msg)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   264
3922
69020a7c234a refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3880
diff changeset
   265
    def session_key(self):
69020a7c234a refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3880
diff changeset
   266
        """return the key that may be used to store / retreive data about a
69020a7c234a refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3880
diff changeset
   267
        previous post which failed because of a validation error
69020a7c234a refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3880
diff changeset
   268
        """
4133
24ffe983abfc force_session_key default to None in base form class...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3953
diff changeset
   269
        if self.force_session_key is not None:
3922
69020a7c234a refactor session_key (__errorurl) to handle cases where the form is generated throuhg an ajax call: in case of an entity form, return the entity's absolute url. Also allow to force session key value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3880
diff changeset
   270
            return self.force_session_key
4133
24ffe983abfc force_session_key default to None in base form class...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3953
diff changeset
   271
        # XXX if this is a json request, suppose we should redirect to the
24ffe983abfc force_session_key default to None in base form class...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3953
diff changeset
   272
        # entity primary view
4183
b5aa030bb2f9 use ._cw instead of .req (reintroduced by merge of stable)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4181
diff changeset
   273
        if self._cw.json_request and self.edited_entity.has_eid():
4133
24ffe983abfc force_session_key default to None in base form class...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3953
diff changeset
   274
            return '%s#%s' % (self.edited_entity.absolute_url(), self.domid)
4662
79c0788ba7f6 add XXX note
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4660
diff changeset
   275
        # XXX we should not consider some url parameters that may lead to
79c0788ba7f6 add XXX note
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4660
diff changeset
   276
        # different url after a validation error
4183
b5aa030bb2f9 use ._cw instead of .req (reintroduced by merge of stable)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4181
diff changeset
   277
        return '%s#%s' % (self._cw.url(), self.domid)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   278
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   279
    def build_context(self, formvalues=None):
4248
d375643eea43 don't add another _cw_edited_field hidden when build_context is called twice (may occurs with inlined relation forms)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4236
diff changeset
   280
        if self.formvalues is not None:
d375643eea43 don't add another _cw_edited_field hidden when build_context is called twice (may occurs with inlined relation forms)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4236
diff changeset
   281
            return # already built
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   282
        super(EntityFieldsForm, self).build_context(formvalues)
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   283
        edited = set()
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   284
        for field in self.fields:
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   285
            if field.eidparam:
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   286
                edited.add(field.role_name())
4660
21ed77792c33 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4659
diff changeset
   287
        self.add_hidden('_cw_edited_fields', u','.join(edited), eidparam=True)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   288
4164
119a374c5eb4 form_add_hidden -> add_hidden
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4162
diff changeset
   289
    def default_renderer(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   290
        return self._cw.vreg['formrenderers'].select(
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   291
            self.form_renderer_id, self._cw, rset=self.cw_rset, row=self.cw_row,
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3396
diff changeset
   292
            col=self.cw_col, entity=self.edited_entity)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   293
4583
356f08325072 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4284
diff changeset
   294
    def should_display_add_new_relation_link(self, rschema, existant, card):
356f08325072 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4284
diff changeset
   295
        return False
356f08325072 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4284
diff changeset
   296
4167
73e649a7797d fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4164
diff changeset
   297
    # controller side method (eg POST reception handling)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   298
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   299
    def actual_eid(self, eid):
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   300
        # should be either an int (existant entity) or a variable (to be
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   301
        # created entity)
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   302
        assert eid or eid == 0, repr(eid) # 0 is a valid eid
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   303
        try:
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   304
            return typed_eid(eid)
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   305
        except ValueError:
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   306
            try:
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   307
                return self._cw.data['eidmap'][eid]
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   308
            except KeyError:
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   309
                self._cw.data['eidmap'][eid] = None
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   310
                return None
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   311
3476
6e927b729ae1 [uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3467
diff changeset
   312
    def editable_relations(self):
2089
b1070848726b backport default branch fix 4ec37d33657e (EntityFieldsForm methods implementation)
Florent <florent@secondweb.fr>
parents: 2080
diff changeset
   313
        return ()
b1070848726b backport default branch fix 4ec37d33657e (EntityFieldsForm methods implementation)
Florent <florent@secondweb.fr>
parents: 2080
diff changeset
   314
4161
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   315
    @deprecated('[3.6] use cw.web.formfields.relvoc_unrelated function')
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   316
    def subject_relation_vocabulary(self, rtype, limit=None):
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   317
        """defaut vocabulary method for the given relation, looking for
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   318
        relation's object entities (i.e. self is the subject)
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   319
        """
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   320
        return relvoc_unrelated(self.edited_entity, rtype, 'subject', limit=None)
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   321
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   322
    @deprecated('[3.6] use cw.web.formfields.relvoc_unrelated function')
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   323
    def object_relation_vocabulary(self, rtype, limit=None):
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   324
        return relvoc_unrelated(self.edited_entity, rtype, 'object', limit=None)
4273f5094651 refactor vocabulary handling to avoid having to define methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4159
diff changeset
   325
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   326
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   327
class CompositeFormMixIn(object):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   328
    __regid__ = 'composite'
3467
a6405235aac6 [tests] make unittest_views_editforms pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   329
    form_renderer_id = __regid__
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   330
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   331
    def __init__(self, *args, **kwargs):
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   332
        super(CompositeFormMixIn, self).__init__(*args, **kwargs)
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   333
        self.forms = []
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   334
3513
c002f6488631 [form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3512
diff changeset
   335
    def add_subform(self, subform):
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   336
        """mark given form as a subform and append it"""
3513
c002f6488631 [form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3512
diff changeset
   337
        subform.parent_form = self
2005
e8032965f37a turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   338
        self.forms.append(subform)
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   339
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   340
    def build_context(self, formvalues=None):
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   341
        super(CompositeFormMixIn, self).build_context(formvalues)
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   342
        for form in self.forms:
4159
6b2b20c73d59 refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4156
diff changeset
   343
            form.build_context(formvalues)
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   344
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   345
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   346
class CompositeForm(CompositeFormMixIn, FieldsForm):
5368
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   347
    """Form composed of sub-forms. Typical usage is edition of multiple entities
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   348
    at once.
d321e4b62a10 [book] start documenting the HTML form system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5367
diff changeset
   349
    """
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   350
3510
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   351
class CompositeEntityForm(CompositeFormMixIn, EntityFieldsForm):
bf746bf4a394 rename form_build_context to build_context, and call it from form, not renderer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3354
diff changeset
   352
    pass # XXX why is this class necessary?