web/views/editforms.py
author Aurelien Campeas <aurelien.campeas@logilab.fr>
Tue, 20 Oct 2009 12:45:44 +0200
branchstable
changeset 3744 767b5d0cd3cc
parent 3742 20f429eb5f46
child 3745 006c81b94ec5
permissions -rw-r--r--
reledit: load actual edition form on demand #471799
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     1
"""Set of HTML automatic forms to create, delete, copy or edit a single entity
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     2
or a list of entities of the same type
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     3
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     4
:organization: Logilab
1977
606923dff11b big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1965
diff changeset
     5
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     6
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
1977
606923dff11b big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1965
diff changeset
     7
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     8
"""
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
     9
__docformat__ = "restructuredtext en"
1965
34f57246330d cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1852
diff changeset
    10
_ = unicode
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    11
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    12
from copy import copy
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    13
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    14
from simplejson import dumps
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    15
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2247
diff changeset
    16
from logilab.mtconverter import xml_escape
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
    17
from logilab.common.decorators import cached
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    18
3532
df045bc51d00 [inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3518
diff changeset
    19
from cubicweb import neg_role
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    20
from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity,
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    21
                                specified_etype_implements, yes)
1132
96752791c2b6 pylint cleanup
sylvain.thenault@logilab.fr
parents: 1091
diff changeset
    22
from cubicweb.view import EntityView
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    23
from cubicweb.common import tags
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
    24
from cubicweb.web import stdmsgs, eid_param
3078
186ccbe0ba3f missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3077
diff changeset
    25
from cubicweb.web import uicfg
2672
c66f52d44394 [reledit] don't try to use rel-edit on attributes without assicated fields (e.g _format field)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2576
diff changeset
    26
from cubicweb.web.form import FormViewMixIn, FieldNotFound
2328
206735882b8e [reledit] use guess_field, thus fixing select widget lacking a multiple attr. in case of * cardinality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2327
diff changeset
    27
from cubicweb.web.formfields import guess_field
206735882b8e [reledit] use guess_field, thus fixing select widget lacking a multiple attr. in case of * cardinality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2327
diff changeset
    28
from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton
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
    29
from cubicweb.web.views import forms
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents: 1459
diff changeset
    30
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    31
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    32
def relation_id(eid, rtype, role, reid):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    33
    """return an identifier for a relation between two entities"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    34
    if role == 'subject':
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    35
        return u'%s:%s:%s' % (eid, rtype, reid)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    36
    return u'%s:%s:%s' % (reid, rtype, eid)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
    37
1528
864ae7c15ef5 other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1498
diff changeset
    38
def toggleable_relation_link(eid, nodeid, label='x'):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    39
    """return javascript snippet to delete/undelete a relation between two
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    40
    entities
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    41
    """
1320
c85f4d8eff8b cleanup
sylvain.thenault@logilab.fr
parents: 1318
diff changeset
    42
    js = u"javascript: togglePendingDelete('%s', %s);" % (
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2247
diff changeset
    43
        nodeid, xml_escape(dumps(eid)))
1320
c85f4d8eff8b cleanup
sylvain.thenault@logilab.fr
parents: 1318
diff changeset
    44
    return u'[<a class="handle" href="%s" id="handle%s">%s</a>]' % (
c85f4d8eff8b cleanup
sylvain.thenault@logilab.fr
parents: 1318
diff changeset
    45
        js, nodeid, label)
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    46
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    47
2572
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    48
class DeleteConfForm(forms.CompositeForm):
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    49
    id = 'deleteconf'
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    50
    __select__ = non_final_entity()
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    51
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    52
    domid = 'deleteconf'
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    53
    copy_nav_params = True
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    54
    form_buttons = [Button(stdmsgs.YES, cwaction='delete'),
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    55
                    Button(stdmsgs.NO, cwaction='cancel')]
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    56
    @property
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    57
    def action(self):
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    58
        return self.build_url('edit')
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    59
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    60
    def __init__(self, *args, **kwargs):
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    61
        super(DeleteConfForm, self).__init__(*args, **kwargs)
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    62
        done = set()
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    63
        for entity in self.rset.entities():
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    64
            if entity.eid in done:
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    65
                continue
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    66
            done.add(entity.eid)
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
    67
            subform = self.vreg['forms'].select('base', self.req, entity=entity,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
    68
                                                mainform=False)
3513
c002f6488631 [form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3355
diff changeset
    69
            self.add_subform(subform)
2572
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    70
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    71
58556f9317c9 [notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2538
diff changeset
    72
class DeleteConfFormView(FormViewMixIn, EntityView):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    73
    """form used to confirm deletion of some entities"""
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    74
    id = 'deleteconf'
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    75
    title = _('delete')
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    76
    # don't use navigation, all entities asked to be deleted should be displayed
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    77
    # else we will only delete the displayed page
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    78
    need_navigation = False
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
    79
1852
f04da596da6c give back onsubmit customizability (oops)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1847
diff changeset
    80
    def call(self, onsubmit=None):
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    81
        """ask for confirmation before real deletion"""
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    82
        req, w = self.req, self.w
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    83
        _ = req._
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    84
        w(u'<script type="text/javascript">updateMessage(\'%s\');</script>\n'
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    85
          % _('this action is not reversible!'))
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    86
        # XXX above message should have style of a warning
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    87
        w(u'<h4>%s</h4>\n' % _('Do you want to delete the following element(s) ?'))
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
    88
        form = self.vreg['forms'].select(self.id, req, rset=self.rset,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
    89
                                         onsubmit=onsubmit)
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    90
        w(u'<ul>\n')
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
    91
        for entity in self.rset.entities():
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    92
            # don't use outofcontext view or any other that may contain inline edition form
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    93
            w(u'<li>%s</li>' % tags.a(entity.view('textoutofcontext'),
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    94
                                      href=entity.absolute_url()))
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    95
        w(u'</ul>\n')
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    96
        w(form.form_render())
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    97
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
    98
1318
50e1a778c5ee new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents: 1313
diff changeset
    99
class ClickAndEditFormView(FormViewMixIn, EntityView):
2686
c700ace6ebfd cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2679
diff changeset
   100
    """form used to permit ajax edition of a relation or attribute of an entity
c700ace6ebfd cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2679
diff changeset
   101
    in a view, if logged user have the permission to edit it.
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   102
2686
c700ace6ebfd cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2679
diff changeset
   103
    (double-click on the field to see an appropriate edition widget).
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   104
    """
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   105
    id = 'doreledit'
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   106
    __select__ = non_final_entity() & match_kwargs('rtype')
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   107
    # FIXME editableField class could be toggleable from userprefs
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   108
2504
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   109
    # add metadata to allow edition of metadata attributes (not considered by
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   110
    # edition form by default)
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   111
    attrcategories = ('primary', 'secondary', 'metadata')
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   112
2365
9f5e911eab07 [reledit] allow composite edition if the composite is object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2361
diff changeset
   113
    _onclick = u"showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')"
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   114
    _onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', "
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   115
                 "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');")
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   116
    _cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')"
2484
7e9283731db8 [reledit] a nicer icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2483
diff changeset
   117
    _defaultlandingzone = (u'<img title="%(msg)s" '
7e9283731db8 [reledit] a nicer icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2483
diff changeset
   118
                           'src="data/accessories-text-editor.png" '
7e9283731db8 [reledit] a nicer icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2483
diff changeset
   119
                           'alt="%(msg)s"/>')
2335
b78249be8a4b [reledit] fix reload type (was a string), use simple clicks instead of doubles
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2334
diff changeset
   120
    _landingzonemsg = _('click to edit this field')
2332
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   121
    # default relation vids according to cardinality
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   122
    _one_rvid = 'incontext'
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   123
    _many_rvid = 'csv'
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   124
2678
0308dc159b96 use yams api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2675
diff changeset
   125
    def _compute_best_vid(self, eschema, rschema, role):
0308dc159b96 use yams api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2675
diff changeset
   126
        if eschema.cardinality(rschema, role) in '+*':
2332
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   127
            return self._many_rvid
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   128
        return self._one_rvid
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   129
2371
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   130
    def _build_landing_zone(self, lzone):
2482
dead2d56f711 [reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2392
diff changeset
   131
        return lzone or self._defaultlandingzone % {'msg' : xml_escape(self.req._(self._landingzonemsg))}
2371
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   132
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   133
    def _build_renderer(self, entity, rtype, role):
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   134
        return self.vreg['formrenderers'].select(
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   135
            'base', self.req, entity=entity, display_label=False,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   136
            display_help=False, display_fields=[(rtype, role)], table_class='',
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   137
            button_bar_class='buttonbar', display_progress_div=False)
2371
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   138
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   139
    def _build_args(self, entity, rtype, role, formid, default, reload, lzone,
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   140
                    extradata=None):
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   141
        divid = '%s-%s-%s' % (entity.eid, rtype, role)
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   142
        event_args = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype,
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   143
                      'reload' : dumps(reload), 'default' : default, 'role' : role, 'vid' : u'',
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   144
                      'lzone' : lzone}
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   145
        if extradata:
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   146
            event_args.update(extradata)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   147
        return divid, event_args
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   148
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   149
    def _build_form(self, entity, rtype, role, formid, default, reload, lzone,
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   150
                  extradata=None, **formargs):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   151
        divid, event_args = self._build_args(entity, rtype, role, formid, default,
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   152
                                      reload, lzone, extradata)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   153
        onsubmit = self._onsubmit % event_args
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   154
        cancelclick = self._cancelclick % (entity.eid, rtype, divid)
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   155
        form = self.vreg['forms'].select(
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   156
            formid, self.req, entity=entity, domid='%s-form' % divid,
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   157
            cssstyle='display: none', onsubmit=onsubmit, action='#',
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   158
            form_buttons=[SubmitButton(), Button(stdmsgs.BUTTON_CANCEL,
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   159
                                                 onclick=cancelclick)],
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   160
            **formargs)
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   161
        form.event_args = event_args
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   162
        return form
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   163
2329
8b5a1af6dc35 [reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2328
diff changeset
   164
    def cell_call(self, row, col, rtype=None, role='subject',
2336
a15d3f54f0f2 [reledit] left in by accident
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2335
diff changeset
   165
                  reload=False,      # controls reloading the whole page after change
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   166
                  rvid=None,         # vid to be applied to other side of rtype (non final relations only)
2332
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   167
                  default=None,      # default value
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   168
                  landing_zone=None  # prepend value with a separate html element to click onto
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   169
                                     # (esp. needed when values are links)
2329
8b5a1af6dc35 [reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2328
diff changeset
   170
                  ):
2371
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   171
        """display field to edit entity's `rtype` relation on click"""
2329
8b5a1af6dc35 [reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2328
diff changeset
   172
        assert rtype
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   173
        assert role in ('subject', 'object'), '%s is not an acceptable role value' % role
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   174
        self.req.add_js('cubicweb.edition.js')
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   175
        self.req.add_css('cubicweb.form.css')
2371
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   176
        if default is None:
76bf522c27be [reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2365
diff changeset
   177
            default = xml_escape(self.req._('<no value>'))
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   178
        entity = self.entity(row, col)
2332
b04d80f19075 [reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2331
diff changeset
   179
        rschema = entity.schema.rschema(rtype)
2482
dead2d56f711 [reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2392
diff changeset
   180
        lzone = self._build_landing_zone(landing_zone)
2333
1de22d3e985b [reledit] landing zone useful only for relations; cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2332
diff changeset
   181
        # compute value, checking perms, build form
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3643
diff changeset
   182
        if rschema.final:
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   183
            form = self._build_form(entity, rtype, role, 'edition', default, reload, lzone,
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   184
                                    attrcategories=self.attrcategories)
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   185
            if not self.should_edit_attribute(entity, rschema, role, form):
3643
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3636
diff changeset
   186
                self.w(entity.printable_value(rtype))
2224
52041b014949 fix #344046 and #344322: check relation permission, set to default when edition allowed and no value (for final *and* non final relations)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2049
diff changeset
   187
                return
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   188
            value = entity.printable_value(rtype) or default
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   189
            self.relation_form(lzone, value, form,
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   190
                               self._build_renderer(entity, rtype, role))
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   191
        else:
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   192
            if rvid is None:
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   193
                rvid = self._compute_best_vid(entity.e_schema, rschema, role)
1579
4eea314694e2 apply on non final relation
sylvain.thenault@logilab.fr
parents: 1576
diff changeset
   194
            rset = entity.related(rtype, role)
2504
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   195
            if rset:
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   196
                value = self.view(rvid, rset)
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   197
            else:
f28b1ffc3c91 some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2484
diff changeset
   198
                value = default
3636
9b16e7b6ba35 [reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3627
diff changeset
   199
            if not self.should_edit_relation(entity, rschema, role, rvid):
9b16e7b6ba35 [reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3627
diff changeset
   200
                if rset:
9b16e7b6ba35 [reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3627
diff changeset
   201
                    self.w(value)
9b16e7b6ba35 [reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3627
diff changeset
   202
                return
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   203
            form = self._build_form(entity, rtype, role, 'base', default, reload, lzone,
3742
20f429eb5f46 kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3689
diff changeset
   204
                                    dict(vid=rvid, lzone=lzone))
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   205
            field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   206
            form.append_field(field)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   207
            self.relation_form(lzone, value, form,
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   208
                               self._build_renderer(entity, rtype, role))
2365
9f5e911eab07 [reledit] allow composite edition if the composite is object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2361
diff changeset
   209
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   210
    def should_edit_attribute(self, entity, rschema, role, form):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   211
        rtype = str(rschema)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   212
        ttype = rschema.targets(entity.id, role)[0]
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   213
        afs = uicfg.autoform_section.etype_get(entity.id, rtype, role, ttype)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   214
        if not (afs in self.attrcategories and entity.has_perm('update')):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   215
            return False
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   216
        try:
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   217
            form.field_by_name(rtype, role)
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   218
        except FieldNotFound:
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   219
            return False
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   220
        return True
1759
61d026ced19f preliminary support for inline edition of relations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1750
diff changeset
   221
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   222
    def should_edit_relation(self, entity, rschema, role, rvid):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   223
        if ((role == 'subject' and not rschema.has_perm(self.req, 'add',
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   224
                                                        fromeid=entity.eid))
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   225
            or
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   226
            (role == 'object' and not rschema.has_perm(self.req, 'add',
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   227
                                                       toeid=entity.eid))):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   228
            self.wview(rvid, entity.related(str(rschema), role), 'null')
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   229
            return False
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   230
        return True
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   231
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   232
    def relation_form(self, lzone, value, form, renderer):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   233
        """xxx-reledit div (class=field)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   234
              +-xxx div (class="editableField")
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   235
              |   +-landing zone
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   236
              +-value
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   237
              +-form-xxx div
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   238
        """
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   239
        w = self.w
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   240
        w(u'<div id="%s-reledit" class="field">' % form.event_args['divid'])
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   241
        w(tags.div(lzone, klass='editableField', id=form.event_args['divid'],
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   242
                   onclick=self._onclick % form.event_args))
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   243
        w(value)
2482
dead2d56f711 [reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2392
diff changeset
   244
        w(form.form_render(renderer=renderer))
dead2d56f711 [reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2392
diff changeset
   245
        w(u'</div>')
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   246
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   247
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   248
class DummyForm(object):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   249
    __slots__ = ('event_args',)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   250
    def form_render(self, **_args):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   251
        return u''
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   252
    def append_field(self, *args):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   253
        pass
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   254
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   255
class AutoClickAndEditFormView(ClickAndEditFormView):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   256
    """same as ClickAndEditFormView but checking if the view *should* be applied
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   257
    by checking uicfg configuration and composite relation property.
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   258
    """
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   259
    id = 'reledit'
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   260
    _onclick = (u"loadInlineEditionForm(%(eid)s, '%(rtype)s', '%(role)s', '%(eid)s', "
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   261
                "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');")
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   262
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   263
    def should_edit_attribute(self, entity, rschema, role, _form):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   264
        rtype = str(rschema)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   265
        ttype = rschema.targets(entity.id, role)[0]
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   266
        afs = uicfg.autoform_section.etype_get(entity.id, rtype, role, ttype)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   267
        if not (afs in self.attrcategories and entity.has_perm('update')):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   268
            return False
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   269
        return True
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   270
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   271
    def should_edit_relation(self, entity, rschema, role, rvid):
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   272
        eschema = entity.e_schema
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   273
        rtype = str(rschema)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   274
        # XXX check autoform_section. what if 'generic'?
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   275
        dispctrl = uicfg.primaryview_display_ctrl.etype_get(eschema, rtype, role)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   276
        vid = dispctrl.get('vid', 'reledit')
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   277
        if vid != 'reledit': # reledit explicitly disabled
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   278
            self.wview(vid, entity.related(rtype, role), 'null')
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   279
            return False
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   280
        if eschema.role_rproperty(role, rschema, 'composite') == role:
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   281
            self.wview(rvid, entity.related(rtype, role), 'null')
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   282
            return False
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   283
        return super(AutoClickAndEditFormView, self).should_edit_relation(
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   284
            entity, rschema, role, rvid)
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   285
3744
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   286
    def _build_form(self, entity, rtype, role, formid, default, reload, lzone,
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   287
                  extradata=None, **formargs):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   288
        _divid, event_args = self._build_args(entity, rtype, role, formid, default,
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   289
                                              reload, lzone, extradata)
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   290
        form = DummyForm()
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   291
        form.event_args = event_args
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   292
        return form
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   293
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   294
    def _build_renderer(self, entity, rtype, role):
767b5d0cd3cc reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3742
diff changeset
   295
        pass
2679
3fa8c0cec760 [reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2678
diff changeset
   296
1318
50e1a778c5ee new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents: 1313
diff changeset
   297
class EditionFormView(FormViewMixIn, EntityView):
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   298
    """display primary entity edition form"""
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   299
    id = 'edition'
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   300
    # add yes() so it takes precedence over deprecated views in baseforms,
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   301
    # though not baseforms based customized view
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   302
    __select__ = one_line_rset() & non_final_entity() & yes()
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   303
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   304
    title = _('edition')
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   305
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   306
    def cell_call(self, row, col, **kwargs):
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   307
        entity = self.complete_entity(row, col)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   308
        self.render_form(entity)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   309
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   310
    def render_form(self, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   311
        """fetch and render the form"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   312
        self.form_title(entity)
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   313
        form = self.vreg['forms'].select('edition', self.req, rset=entity.rset,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   314
                                         row=entity.row, col=entity.col, entity=entity,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   315
                                         submitmsg=self.submited_message())
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   316
        self.init_form(form, entity)
1995
ec95eaa2b711 turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   317
        self.w(form.form_render(formvid=u'edition'))
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   318
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   319
    def init_form(self, form, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   320
        """customize your form before rendering here"""
2049
b9baedffeb8b set __maineid in EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2048
diff changeset
   321
        pass
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   322
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   323
    def form_title(self, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   324
        """the form view title"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   325
        ptitle = self.req._(self.title)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   326
        self.w(u'<div class="formTitle"><span>%s %s</span></div>' % (
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   327
            entity.dc_type(), ptitle and '(%s)' % ptitle))
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   328
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   329
    def submited_message(self):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   330
        """return the message that will be displayed on successful edition"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   331
        return self.req._('entity edited')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   332
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   333
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   334
class CreationFormView(EditionFormView):
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   335
    """display primary entity creation form"""
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   336
    id = 'creation'
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   337
    __select__ = specified_etype_implements('Any') & yes()
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   338
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   339
    title = _('creation')
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   340
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   341
    def call(self, **kwargs):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   342
        """creation view for an entity"""
3346
b1fd9d4ef579 fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3331
diff changeset
   343
        # at this point we know etype is a valid entity type, thanks to our
b1fd9d4ef579 fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3331
diff changeset
   344
        # selector
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   345
        etype = kwargs.pop('etype', self.req.form.get('etype'))
3077
6c92323667a6 case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3062
diff changeset
   346
        entity = self.vreg['etypes'].etype_class(etype)(self.req)
6c92323667a6 case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3062
diff changeset
   347
        self.initialize_varmaker()
6c92323667a6 case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3062
diff changeset
   348
        entity.eid = self.varmaker.next()
6c92323667a6 case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3062
diff changeset
   349
        self.render_form(entity)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   350
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   351
    def form_title(self, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   352
        """the form view title"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   353
        if '__linkto' in self.req.form:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   354
            if isinstance(self.req.form['__linkto'], list):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   355
                # XXX which one should be considered (case: add a ticket to a
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   356
                # version in jpl)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   357
                rtype, linkto_eid, role = self.req.form['__linkto'][0].split(':')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   358
            else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   359
                rtype, linkto_eid, role = self.req.form['__linkto'].split(':')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   360
            linkto_rset = self.req.eid_rset(linkto_eid)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   361
            linkto_type = linkto_rset.description[0][0]
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   362
            if role == 'subject':
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   363
                title = self.req.__('creating %s (%s %s %s %%(linkto)s)' % (
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   364
                    entity.e_schema, entity.e_schema, rtype, linkto_type))
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   365
            else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   366
                title = self.req.__('creating %s (%s %%(linkto)s %s %s)' % (
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   367
                    entity.e_schema, linkto_type, rtype, entity.e_schema))
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   368
            msg = title % {'linkto' : self.view('incontext', linkto_rset)}
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   369
            self.w(u'<div class="formTitle notransform"><span>%s</span></div>' % msg)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   370
        else:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   371
            super(CreationFormView, self).form_title(entity)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   372
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   373
    def url(self):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   374
        """return the url associated with this view"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   375
        return self.create_url(self.req.form.get('etype'))
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   376
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   377
    def submited_message(self):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   378
        """return the message that will be displayed on successful edition"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   379
        return self.req._('entity created')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   380
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   381
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   382
class CopyFormView(EditionFormView):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   383
    """display primary entity creation form initialized with values from another
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   384
    entity
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   385
    """
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   386
    id = 'copy'
3627
70dbba754c11 fix title of CopyFormView
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 3586
diff changeset
   387
    title = _('copy')
3062
a8e901fc4457 ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2686
diff changeset
   388
    warning_message = _('Please note that this is only a shallow copy')
a8e901fc4457 ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2686
diff changeset
   389
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   390
    def render_form(self, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   391
        """fetch and render the form"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   392
        # make a copy of entity to avoid altering the entity in the
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   393
        # request's cache.
1685
3c59ae0e6548 fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1629
diff changeset
   394
        entity.complete()
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   395
        self.newentity = copy(entity)
1703
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   396
        self.copying = entity
1685
3c59ae0e6548 fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1629
diff changeset
   397
        self.initialize_varmaker()
3c59ae0e6548 fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1629
diff changeset
   398
        self.newentity.eid = self.varmaker.next()
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   399
        self.w(u'<script type="text/javascript">updateMessage("%s");</script>\n'
3062
a8e901fc4457 ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2686
diff changeset
   400
               % self.req._(self.warning_message))
1685
3c59ae0e6548 fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents: 1629
diff changeset
   401
        super(CopyFormView, self).render_form(self.newentity)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   402
        del self.newentity
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   403
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   404
    def init_form(self, form, entity):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   405
        """customize your form before rendering here"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   406
        super(CopyFormView, self).init_form(form, entity)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   407
        if entity.eid == self.newentity.eid:
1703
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   408
            form.form_add_hidden(eid_param('__cloned_eid', entity.eid),
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   409
                                 self.copying.eid)
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   410
        for rschema, _, role in form.relations_by_category(form.attrcategories,
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   411
                                                           'add'):
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3643
diff changeset
   412
            if not rschema.final:
1703
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   413
                # ensure relation cache is filed
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   414
                rset = self.copying.related(rschema, role)
a2b5dfdb4b62 should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents: 1692
diff changeset
   415
                self.newentity.set_related_cache(rschema, role, rset)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   416
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   417
    def submited_message(self):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   418
        """return the message that will be displayed on successful edition"""
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   419
        return self.req._('entity copied')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   420
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   421
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
   422
class TableEditForm(forms.CompositeForm):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   423
    id = 'muledit'
1692
56009f2101fe fix multiple edit
sylvain.thenault@logilab.fr
parents: 1685
diff changeset
   424
    domid = 'entityForm'
56009f2101fe fix multiple edit
sylvain.thenault@logilab.fr
parents: 1685
diff changeset
   425
    onsubmit = "return validateForm('%s', null);" % domid
1304
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1297
diff changeset
   426
    form_buttons = [SubmitButton(_('validate modifications on selected items')),
8975c8e520a9 refactor button handling
sylvain.thenault@logilab.fr
parents: 1297
diff changeset
   427
                    ResetButton(_('revert changes'))]
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   428
1692
56009f2101fe fix multiple edit
sylvain.thenault@logilab.fr
parents: 1685
diff changeset
   429
    def __init__(self, req, rset, **kwargs):
56009f2101fe fix multiple edit
sylvain.thenault@logilab.fr
parents: 1685
diff changeset
   430
        kwargs.setdefault('__redirectrql', rset.printable_rql())
56009f2101fe fix multiple edit
sylvain.thenault@logilab.fr
parents: 1685
diff changeset
   431
        super(TableEditForm, self).__init__(req, rset, **kwargs)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   432
        for row in xrange(len(self.rset)):
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   433
            form = self.vreg['forms'].select('edition', self.req,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   434
                                             rset=self.rset, row=row,
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   435
                                             attrcategories=('primary',),
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   436
                                             mainform=False)
1324
a82f83188695 ease renderer overriding
sylvain.thenault@logilab.fr
parents: 1322
diff changeset
   437
            # XXX rely on the EntityCompositeFormRenderer to put the eid input
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   438
            form.remove_field(form.field_by_name('eid'))
3513
c002f6488631 [form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3355
diff changeset
   439
            self.add_subform(form)
1091
b5e253c0dd13 a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff changeset
   440
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   441
1318
50e1a778c5ee new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents: 1313
diff changeset
   442
class TableEditFormView(FormViewMixIn, EntityView):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   443
    id = 'muledit'
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   444
    __select__ = EntityView.__select__ & yes()
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   445
    title = _('multiple edit')
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   446
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   447
    def call(self, **kwargs):
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   448
        """a view to edit multiple entities of the same type the first column
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   449
        should be the eid
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   450
        """
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   451
        #self.form_title(entity)
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2576
diff changeset
   452
        form = self.vreg['forms'].select(self.id, self.req, rset=self.rset)
1995
ec95eaa2b711 turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   453
        self.w(form.form_render())
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   454
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   455
1318
50e1a778c5ee new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents: 1313
diff changeset
   456
class InlineEntityEditionFormView(FormViewMixIn, EntityView):
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   457
    """
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   458
    :attr peid: the parent entity's eid hosting the inline form
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   459
    :attr rtype: the relation bridging `etype` and `peid`
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   460
    :attr role: the role played by the `peid` in the relation
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   461
    :attr pform: the parent form where this inlined form is being displayed
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   462
    """
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   463
    id = 'inline-edition'
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   464
    __select__ = non_final_entity() & match_kwargs('peid', 'rtype')
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   465
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   466
    _select_attrs = ('peid', 'rtype', 'role', 'pform')
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   467
    removejs = "removeInlinedEntity('%s', '%s', '%s')"
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   468
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   469
    def __init__(self, *args, **kwargs):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   470
        for attr in self._select_attrs:
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   471
            setattr(self, attr, kwargs.pop(attr, None))
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   472
        super(InlineEntityEditionFormView, self).__init__(*args, **kwargs)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   473
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   474
    def _entity(self):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   475
        assert self.row is not None, self
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   476
        return self.rset.get_entity(self.row, self.col)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   477
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   478
    @property
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   479
    @cached
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   480
    def form(self):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   481
        entity = self._entity()
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   482
        form = self.vreg['forms'].select('edition', self.req,
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   483
                                         entity=entity,
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   484
                                         form_renderer_id='inline',
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   485
                                         mainform=False, copy_nav_params=False,
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   486
                                         **self.extra_kwargs)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   487
        form.parent_form = self.pform
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   488
        self.add_hiddens(form, entity)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   489
        return form
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   490
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   491
    def cell_call(self, row, col, i18nctx, **kwargs):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   492
        """
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   493
        :param peid: the parent entity's eid hosting the inline form
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   494
        :param rtype: the relation bridging `etype` and `peid`
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   495
        :param role: the role played by the `peid` in the relation
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   496
        """
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   497
        entity = self._entity()
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   498
        divonclick = "restoreInlinedEntity('%s', '%s', '%s')" % (
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   499
            self.peid, self.rtype, entity.eid)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   500
        self.render_form(i18nctx, divonclick=divonclick, **kwargs)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   501
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   502
    def render_form(self, i18nctx, **kwargs):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   503
        """fetch and render the form"""
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   504
        entity = self._entity()
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   505
        divid = '%s-%s-%s' % (self.peid, self.rtype, entity.eid)
3327
44efba78afac fix/enhance i18n context usage for inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3078
diff changeset
   506
        title = self.req.pgettext(i18nctx, 'This %s' % entity.e_schema)
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   507
        removejs = self.removejs % (self.peid, self.rtype, entity.eid)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   508
        countkey = '%s_count' % self.rtype
2247
9dbbe6a4c9b0 use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2224
diff changeset
   509
        try:
9dbbe6a4c9b0 use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2224
diff changeset
   510
            self.req.data[countkey] += 1
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   511
        except KeyError:
2247
9dbbe6a4c9b0 use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2224
diff changeset
   512
            self.req.data[countkey] = 1
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   513
        self.w(self.form.form_render(
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   514
            divid=divid, title=title, removejs=removejs, i18nctx=i18nctx,
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   515
            counter=self.req.data[countkey], **kwargs))
1396
daaebf6b9922 refactor to ease overriding
sylvain.thenault@logilab.fr
parents: 1366
diff changeset
   516
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   517
    def add_hiddens(self, form, entity):
3532
df045bc51d00 [inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3518
diff changeset
   518
        """to ease overriding (see cubes.vcsfile.views.forms for instance)"""
df045bc51d00 [inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3518
diff changeset
   519
        iid = 'rel-%s-%s-%s' % (self.peid, self.rtype, entity.eid)
3586
52b00c5e441a cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3534
diff changeset
   520
        #  * str(self.rtype) in case it's a schema object
3534
81cfec545e1b ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3532
diff changeset
   521
        #  * neged_role() since role is the for parent entity, we want the role
81cfec545e1b ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3532
diff changeset
   522
        #    of the inlined entity
81cfec545e1b ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3532
diff changeset
   523
        form.form_add_hidden(name=str(self.rtype), value=self.peid,
3532
df045bc51d00 [inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3518
diff changeset
   524
                             role=neg_role(self.role), eidparam=True, id=iid)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   525
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   526
    def keep_entity(self, form, entity):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   527
        if not entity.has_eid():
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   528
            return True
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   529
        # are we regenerating form because of a validation error ?
1750
9df5e65c5f79 fix name error
sylvain.thenault@logilab.fr
parents: 1710
diff changeset
   530
        if form.form_previous_values:
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   531
            cdvalues = self.req.list_form_param(eid_param(self.rtype, self.peid),
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: 1703
diff changeset
   532
                                                form.form_previous_values)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   533
            if unicode(entity.eid) not in cdvalues:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   534
                return False
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   535
        return True
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   536
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   537
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   538
class InlineEntityCreationFormView(InlineEntityEditionFormView):
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   539
    """
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   540
    :attr etype: the entity type being created in the inline form
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   541
    """
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   542
    id = 'inline-creation'
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   543
    __select__ = (match_kwargs('peid', 'rtype')
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   544
                  & specified_etype_implements('Any'))
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   545
    _select_attrs = InlineEntityEditionFormView._select_attrs + ('etype',)
1423
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   546
    removejs = "removeInlineForm('%s', '%s', '%s')"
39320a58faac missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents: 1396
diff changeset
   547
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   548
    @cached
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   549
    def _entity(self):
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   550
        try:
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   551
            cls = self.vreg['etypes'].etype_class(self.etype)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   552
        except:
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   553
            self.w(self.req._('no such entity type %s') % etype)
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   554
            return
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   555
        self.initialize_varmaker()
3331
8e63b72287b1 cleaner code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3327
diff changeset
   556
        entity = cls(self.req)
1147
402e8a8b1d6a more form works
sylvain.thenault@logilab.fr
parents: 1138
diff changeset
   557
        entity.eid = self.varmaker.next()
3518
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   558
        return entity
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   559
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   560
    def call(self, i18nctx, **kwargs):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   561
        self.render_form(i18nctx, **kwargs)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   562
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   563
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   564
class InlineAddNewLinkView(InlineEntityCreationFormView):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   565
    """
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   566
    :attr card: the cardinality of the relation according to role of `peid`
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   567
    """
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   568
    id = 'inline-addnew-link'
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   569
    __select__ = (match_kwargs('peid', 'rtype')
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   570
                  & specified_etype_implements('Any'))
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   571
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   572
    _select_attrs = InlineEntityCreationFormView._select_attrs + ('card',)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   573
    form = None # no actual form wrapped
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   574
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   575
    def call(self, i18nctx, **kwargs):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   576
        divid = "addNew%s%s%s:%s" % (self.etype, self.rtype, self.role, self.peid)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   577
        self.w(u'<div class="inlinedform" id="%s" cubicweb:limit="true">'
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   578
          % divid)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   579
        js = "addInlineCreationForm('%s', '%s', '%s', '%s', '%s')" % (
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   580
            self.peid, self.etype, self.rtype, self.role, i18nctx)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   581
        if self.pform.should_hide_add_new_relation_link(self.rtype, self.card):
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   582
            js = "toggleVisibility('%s'); %s" % (divid, js)
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   583
        __ = self.req.pgettext
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   584
        self.w(u'<a class="addEntity" id="add%s:%slink" href="javascript: %s" >+ %s.</a>'
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   585
          % (self.rtype, self.peid, js, __(i18nctx, 'add a %s' % self.etype)))
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   586
        self.w(u'</div>')
11ce4682187d [form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3513
diff changeset
   587
        self.w(u'<div class="trame_grise">&#160;</div>')