web/views/reledit.py
author Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
Mon, 27 Feb 2012 17:02:31 +0100
changeset 8298 2a4bc6f75e9c
parent 8253 df7d6c57a6c8
child 8665 e65af61bde7d
permissions -rw-r--r--
[twisted] move out url logic from twisted (closes #2200593) Data, fck and static file are now served by cubicweb controller by default. Some hackish url rewriting is necessary to have them selected. This is necessary because cubicweb does not selection controller on multi level path. - 'Expires' header seems to conflict with Cache-Control set by HTTPCacheManger (don't know yet why HTTPCacheManager is involved here) mod_wsgi is now usable in simple cases (e.g. still requires persisten sessions).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7151
04d0624a1832 [reledit] fix crash due to wrong attributes usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7070
diff changeset
     1
# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5940
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     3
#
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     4
# This file is part of CubicWeb.
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     5
#
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
     9
# any later version.
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    10
#
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    14
# details.
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    15
#
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    18
"""edit entity attributes/relations from any view, without going to the entity
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    19
form
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    20
"""
6582
8eb7883b4223 [pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6329
diff changeset
    21
8eb7883b4223 [pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6329
diff changeset
    22
__docformat__ = "restructuredtext en"
8eb7883b4223 [pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6329
diff changeset
    23
_ = unicode
5940
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5878
diff changeset
    24
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    25
import copy
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
    26
from warnings import warn
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    27
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    28
from logilab.mtconverter import xml_escape
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    29
from logilab.common.deprecation import deprecated, class_renamed
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    30
from logilab.common.decorators import cached
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    31
8253
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
    32
from cubicweb import neg_role, typed_eid
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    33
from cubicweb.schema import display_name
8253
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
    34
from cubicweb.utils import json, json_dumps
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8100
diff changeset
    35
from cubicweb.predicates import non_final_entity, match_kwargs
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    36
from cubicweb.view import EntityView
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    37
from cubicweb.web import uicfg, stdmsgs
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
    38
from cubicweb.web.form import FieldNotFound
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    39
from cubicweb.web.formwidgets import Button, SubmitButton
8253
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
    40
from cubicweb.web.views.ajaxcontroller import ajaxfunc
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    41
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
    42
class _DummyForm(object):
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    43
    __slots__ = ('event_args',)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    44
    def form_render(self, **_args):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    45
        return u''
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    46
    def render(self, *_args, **_kwargs):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    47
        return u''
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    48
    def append_field(self, *args):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    49
        pass
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    50
    def add_hidden(self, *args):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    51
        pass
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
    52
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
    53
rctrl = uicfg.reledit_ctrl
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    54
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    55
class AutoClickAndEditFormView(EntityView):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    56
    __regid__ = 'reledit'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    57
    __select__ = non_final_entity() & match_kwargs('rtype')
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    58
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    59
    # ui side continuations
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    60
    _onclick = (u"cw.reledit.loadInlineEditionForm('%(formid)s', %(eid)s, '%(rtype)s', '%(role)s', "
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    61
                "'%(divid)s', %(reload)s, '%(vid)s', '%(action)s');")
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    62
    _cancelclick = "cw.reledit.cleanupAfterCancel('%s')"
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    63
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    64
    # ui side actions/buttons
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    65
    _addzone = u'<img title="%(msg)s" src="%(logo)s" alt="%(msg)s"/>'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    66
    _addmsg = _('click to add a value')
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    67
    _addlogo = 'plus.png'
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    68
    _deletezone = u'<img title="%(msg)s" src="%(logo)s" alt="%(msg)s"/>'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    69
    _deletemsg = _('click to delete this value')
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    70
    _deletelogo = 'cancel.png'
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    71
    _editzone = u'<img title="%(msg)s" src="%(logo)s" alt="%(msg)s"/>'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    72
    _editzonemsg = _('click to edit this field')
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
    73
    _editlogo = 'pen_icon.png'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    74
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
    75
    # renderer
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
    76
    _form_renderer_id = 'base'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    77
8100
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    78
    def entity_call(self, entity, rtype=None, role='subject',
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    79
                    reload=False, # controls reloading the whole page after change
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    80
                                  # boolean, eid (to redirect), or
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    81
                                  # function taking the subject entity & returning a boolean or an eid
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    82
                    rvid=None,    # vid to be applied to other side of rtype (non final relations only)
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    83
                    default_value=None,
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    84
                    formid='base',
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    85
                    action=None
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    86
                    ):
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    87
        """display field to edit entity's `rtype` relation on click"""
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    88
        assert rtype
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    89
        self._cw.add_css('cubicweb.form.css')
6755
799ae44925c4 [views/reledit] funky API made this fatal (it was previously only eating the second argument)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6754
diff changeset
    90
        self._cw.add_js(('cubicweb.reledit.js', 'cubicweb.edition.js', 'cubicweb.ajax.js'))
8100
21918a60a5c5 [reledit] implements entity_call instead of cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8086
diff changeset
    91
        self.entity = entity
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    92
        rschema = self._cw.vreg.schema[rtype]
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    93
        self._rules = rctrl.etype_get(self.entity.e_schema.type, rschema.type, role, '*')
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
    94
        if rvid is not None or default_value is not None:
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
    95
            warn('[3.9] specifying rvid/default_value on select is deprecated, '
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
    96
                 'reledit_ctrl rtag to control this' % self, DeprecationWarning)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    97
        reload = self._compute_reload(rschema, role, reload)
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
    98
        divid = self._build_divid(rtype, role, self.entity.eid)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    99
        if rschema.final:
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   100
            self._handle_attribute(rschema, role, divid, reload, action)
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   101
        else:
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   102
            if self._is_composite():
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   103
                self._handle_composite(rschema, role, divid, reload, formid, action)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   104
            else:
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   105
                self._handle_relation(rschema, role, divid, reload, formid, action)
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   106
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   107
    def _handle_attribute(self, rschema, role, divid, reload, action):
7834
258fc0b4a1e0 [reledit] honore 'rvid' for attribute relations (closes #1947471)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7156
diff changeset
   108
        rvid = self._rules.get('rvid', None)
258fc0b4a1e0 [reledit] honore 'rvid' for attribute relations (closes #1947471)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7156
diff changeset
   109
        if rvid is not None:
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7834
diff changeset
   110
            value = self._cw.view(rvid, entity=self.entity,
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7834
diff changeset
   111
                                  rtype=rschema.type, role=role)
7834
258fc0b4a1e0 [reledit] honore 'rvid' for attribute relations (closes #1947471)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7156
diff changeset
   112
        else:
258fc0b4a1e0 [reledit] honore 'rvid' for attribute relations (closes #1947471)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7156
diff changeset
   113
            value = self.entity.printable_value(rschema.type)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   114
        if not self._should_edit_attribute(rschema):
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   115
            self.w(value)
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   116
            return
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7834
diff changeset
   117
        form, renderer = self._build_form(self.entity, rschema, role, divid,
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7834
diff changeset
   118
                                          'base', reload, action)
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   119
        value = value or self._compute_default_value(rschema, role)
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   120
        self.view_form(divid, value, form, renderer)
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   121
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   122
    def _compute_formid_value(self, rschema, role, rvid, formid):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   123
        related_rset = self.entity.related(rschema.type, role)
6111
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   124
        if related_rset:
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   125
            value = self._cw.view(rvid, related_rset)
06c96a79c3c0 [views/reledit] small refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6110
diff changeset
   126
        else:
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   127
            value = self._compute_default_value(rschema, role)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   128
        if not self._should_edit_relation(rschema, role):
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   129
            return None, value
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   130
        return formid, value
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   131
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   132
    def _handle_relation(self, rschema, role, divid, reload, formid, action):
6329
918dd7448630 [reledit] drop compute_best_vid method now useless
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6289
diff changeset
   133
        rvid = self._rules.get('rvid', 'autolimited')
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   134
        formid, value = self._compute_formid_value(rschema, role, rvid, formid)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   135
        if formid is None:
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   136
            return self.w(value)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   137
        form, renderer = self._build_form(self.entity,  rschema, role, divid, formid,
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   138
                                          reload, action, dict(vid=rvid))
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   139
        self.view_form(divid, value, form, renderer)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   140
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   141
    def _handle_composite(self, rschema, role, divid, reload, formid, action):
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   142
        # this is for attribute-like composites (1 target type, 1 related entity at most, for now)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   143
        entity = self.entity
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   144
        related_rset = entity.related(rschema.type, role)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   145
        add_related = self._may_add_related(related_rset, rschema, role)
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   146
        edit_related = self._may_edit_related_entity(related_rset, rschema, role)
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   147
        delete_related = edit_related and self._may_delete_related(related_rset, rschema, role)
6329
918dd7448630 [reledit] drop compute_best_vid method now useless
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6289
diff changeset
   148
        rvid = self._rules.get('rvid', 'autolimited')
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   149
        formid, value = self._compute_formid_value(rschema, role, rvid, formid)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   150
        if formid is None or not (edit_related or add_related):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   151
            # till we learn to handle cases where not (edit_related or add_related)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   152
            self.w(value)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   153
            return
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   154
        form, renderer = self._build_form(entity, rschema, role, divid, formid,
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   155
                                          reload, action, dict(vid=rvid))
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   156
        self.view_form(divid, value, form, renderer,
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   157
                       edit_related, add_related, delete_related)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   158
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   159
    @cached
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   160
    def _compute_ttypes(self, rschema, role):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   161
        dual_role = neg_role(role)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   162
        return getattr(rschema, '%ss' % dual_role)()
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   163
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   164
    def _compute_reload(self, rschema, role, reload):
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   165
        ctrl_reload = self._rules.get('reload', reload)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   166
        if callable(ctrl_reload):
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   167
            ctrl_reload = ctrl_reload(self.entity)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   168
        if isinstance(ctrl_reload, int) and ctrl_reload > 1: # not True/False
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   169
            ctrl_reload = self._cw.build_url(ctrl_reload)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   170
        return ctrl_reload
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   171
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   172
    def _compute_default_value(self, rschema, role):
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   173
        default = self._rules.get('novalue_label')
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   174
        if default is None:
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   175
            if self._rules.get('novalue_include_rtype'):
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   176
                default = self._cw._('<%s not specified>') % display_name(
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   177
                    self._cw, rschema.type, role)
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   178
            else:
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   179
                default = self._cw._('<not specified>')
8086
a057a0a4371b [reledit] default label should be translated, I don't thing we've an opportunity to do it another way as uicfg objects are static
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7879
diff changeset
   180
        else:
a057a0a4371b [reledit] default label should be translated, I don't thing we've an opportunity to do it another way as uicfg objects are static
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7879
diff changeset
   181
            default = self._cw._(default)
6283
c827fa795a6b [reledit] more api cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6282
diff changeset
   182
        return xml_escape(default)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   183
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   184
    def _is_composite(self):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   185
        return self._rules.get('edit_target') == 'related'
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   186
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   187
    def _may_add_related(self, related_rset, rschema, role):
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   188
        """ ok for attribute-like composite entities """
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   189
        ttypes = self._compute_ttypes(rschema, role)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   190
        if len(ttypes) > 1: # many etypes: learn how to do it
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   191
            return False
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   192
        rdef = rschema.role_rdef(self.entity.e_schema, ttypes[0], role)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   193
        card = rdef.role_cardinality(role)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   194
        if related_rset or card not in '?1':
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   195
            return False
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   196
        if role == 'subject':
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   197
            kwargs = {'fromeid': self.entity.eid}
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   198
        else:
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   199
            kwargs = {'toeid': self.entity.eid}
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   200
        return rdef.has_perm(self._cw, 'add', **kwargs)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   201
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   202
    def _may_edit_related_entity(self, related_rset, rschema, role):
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   203
        """ controls the edition of the related entity """
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   204
        ttypes = self._compute_ttypes(rschema, role)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   205
        if len(ttypes) > 1 or len(related_rset.rows) != 1:
5878
8d1ca4150397 [reledit] fix relation cardinality handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5874
diff changeset
   206
            return False
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   207
        if self.entity.e_schema.rdef(rschema, role).role_cardinality(role) not in '?1':
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   208
            return False
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   209
        return related_rset.get_entity(0, 0).cw_has_perm('update')
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   210
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   211
    def _may_delete_related(self, related_rset, rschema, role):
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   212
        # we assume may_edit_related, only 1 related entity
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   213
        if not related_rset:
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   214
            return False
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   215
        rentity = related_rset.get_entity(0, 0)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   216
        entity = self.entity
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   217
        if role == 'subject':
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   218
            kwargs = {'fromeid': entity.eid, 'toeid': rentity.eid}
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   219
        else:
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   220
            kwargs = {'fromeid': rentity.eid, 'toeid': entity.eid}
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   221
        # NOTE: should be sufficient given a well built schema/security
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   222
        return rschema.has_perm(self._cw, 'delete', **kwargs)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   223
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
   224
    def _build_zone(self, zonedef, msg, logo):
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
   225
        return zonedef % {'msg': xml_escape(self._cw._(msg)),
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
   226
                          'logo': xml_escape(self._cw.data_url(logo))}
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
   227
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   228
    def _build_edit_zone(self):
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6932
diff changeset
   229
        return self._build_zone(self._editzone, self._editzonemsg, self._editlogo)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   230
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   231
    def _build_delete_zone(self):
7151
04d0624a1832 [reledit] fix crash due to wrong attributes usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7070
diff changeset
   232
        return self._build_zone(self._deletezone, self._deletemsg, self._deletelogo)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   233
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   234
    def _build_add_zone(self):
7151
04d0624a1832 [reledit] fix crash due to wrong attributes usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7070
diff changeset
   235
        return self._build_zone(self._addzone, self._addmsg, self._addlogo)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   236
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   237
    def _build_divid(self, rtype, role, entity_eid):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   238
        """ builds an id for the root div of a reledit widget """
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   239
        return '%s-%s-%s' % (rtype, role, entity_eid)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   240
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   241
    def _build_args(self, entity, rtype, role, formid, reload, action,
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   242
                    extradata=None):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   243
        divid = self._build_divid(rtype, role, entity.eid)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   244
        event_args = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'formid': formid,
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   245
                      'reload' : json_dumps(reload), 'action': action,
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   246
                      'role' : role, 'vid' : u''}
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   247
        if extradata:
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   248
            event_args.update(extradata)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   249
        return event_args
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   250
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   251
    def _prepare_form(self, entity, rschema, role, action):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   252
        assert action in ('edit_rtype', 'edit_related', 'add', 'delete'), action
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   253
        if action == 'edit_rtype':
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   254
            return False, entity
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   255
        label = True
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   256
        if action in ('edit_related', 'delete'):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   257
            edit_entity = entity.related(rschema, role).get_entity(0, 0)
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   258
        elif action == 'add':
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   259
            add_etype = self._compute_ttypes(rschema, role)[0]
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   260
            _new_entity = self._cw.vreg['etypes'].etype_class(add_etype)(self._cw)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   261
            _new_entity.eid = self._cw.varmaker.next()
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   262
            edit_entity = _new_entity
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   263
            # XXX see forms.py ~ 276 and entities.linked_to method
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   264
            #     is there another way ?
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   265
            self._cw.form['__linkto'] = '%s:%s:%s' % (rschema, entity.eid, neg_role(role))
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   266
        assert edit_entity
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   267
        return label, edit_entity
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   268
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   269
    def _build_renderer(self, related_entity, display_label):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   270
        return self._cw.vreg['formrenderers'].select(
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   271
            self._form_renderer_id, self._cw, entity=related_entity,
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   272
            display_label=display_label,
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   273
            table_class='attributeForm' if display_label else '',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   274
            display_help=False, button_bar_class='buttonbar',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   275
            display_progress_div=False)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   276
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   277
    def _build_form(self, entity, rschema, role, divid, formid, reload, action,
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   278
                    extradata=None, **formargs):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   279
        rtype = rschema.type
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   280
        event_args = self._build_args(entity, rtype, role, formid, reload, action, extradata)
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   281
        if not action:
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   282
            form = _DummyForm()
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   283
            form.event_args = event_args
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   284
            return form, None
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   285
        label, edit_entity = self._prepare_form(entity, rschema, role, action)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   286
        cancelclick = self._cancelclick % divid
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   287
        form = self._cw.vreg['forms'].select(
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   288
            formid, self._cw, rset=edit_entity.as_rset(), entity=edit_entity,
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   289
            domid='%s-form' % divid, formtype='inlined',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   290
            action=self._cw.build_url('validateform', __onsuccess='window.parent.cw.reledit.onSuccess'),
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   291
            cwtarget='eformframe', cssclass='releditForm',
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   292
            **formargs)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   293
        # pass reledit arguments
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   294
        for pname, pvalue in event_args.iteritems():
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   295
            form.add_hidden('__reledit|' + pname, pvalue)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   296
        # handle buttons
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   297
        if form.form_buttons: # edition, delete
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   298
            form_buttons = []
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   299
            for button in form.form_buttons:
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   300
                if not button.label.endswith('apply'):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   301
                    if button.label.endswith('cancel'):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   302
                        button = copy.deepcopy(button)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   303
                        button.cwaction = None
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   304
                        button.onclick = cancelclick
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   305
                    form_buttons.append(button)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   306
            form.form_buttons = form_buttons
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   307
        else: # base
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   308
            form.form_buttons = [SubmitButton(),
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   309
                                 Button(stdmsgs.BUTTON_CANCEL, onclick=cancelclick)]
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   310
        form.event_args = event_args
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   311
        if formid == 'base':
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   312
            field = form.field_by_name(rtype, role, entity.e_schema)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   313
            form.append_field(field)
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   314
        return form, self._build_renderer(edit_entity, label)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   315
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   316
    def _should_edit_attribute(self, rschema):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   317
        entity = self.entity
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   318
        rdef = entity.e_schema.rdef(rschema)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   319
        # check permissions
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   320
        if not entity.cw_has_perm('update'):
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   321
            return False
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   322
        rdef = entity.e_schema.rdef(rschema)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   323
        return rdef.has_perm(self._cw, 'update', eid=entity.eid)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   324
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   325
    should_edit_attributes = deprecated('[3.9] should_edit_attributes is deprecated,'
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   326
                                        ' use _should_edit_attribute instead',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   327
                                        _should_edit_attribute)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   328
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   329
    def _should_edit_relation(self, rschema, role):
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   330
        eeid = self.entity.eid
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   331
        perm_args = {'fromeid': eeid} if role == 'subject' else {'toeid': eeid}
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   332
        return rschema.has_perm(self._cw, 'add', **perm_args)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   333
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   334
    should_edit_relations = deprecated('[3.9] should_edit_relations is deprecated,'
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   335
                                       ' use _should_edit_relation instead',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   336
                                       _should_edit_relation)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   337
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   338
    def _open_form_wrapper(self, divid, value, form, renderer,
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   339
                           _edit_related, _add_related, _delete_related):
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   340
        w = self.w
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   341
        w(u'<div id="%(id)s-reledit" onmouseout="%(out)s" onmouseover="%(over)s" class="%(css)s">' %
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   342
          {'id': divid, 'css': 'releditField',
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   343
           'out': "jQuery('#%s').addClass('hidden')" % divid,
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   344
           'over': "jQuery('#%s').removeClass('hidden')" % divid})
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   345
        w(u'<div id="%s-value" class="editableFieldValue">' % divid)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   346
        w(value)
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   347
        w(u'</div>')
6596
9717122d5e06 [3.10] drop deprecation warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6582
diff changeset
   348
        form.render(w=w, renderer=renderer)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   349
        w(u'<div id="%s" class="editableField hidden">' % divid)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   350
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   351
    def _edit_action(self, divid, args, edit_related, add_related, _delete_related):
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   352
        # XXX disambiguate wrt edit_related
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   353
        if not add_related: # currently, excludes edition
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   354
            w = self.w
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   355
            args['formid'] = 'edition' if edit_related else 'base'
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   356
            args['action'] = 'edit_related' if edit_related else 'edit_rtype'
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   357
            w(u'<div id="%s-update" class="editableField" onclick="%s" title="%s">' %
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   358
              (divid, xml_escape(self._onclick % args), self._cw._(self._editzonemsg)))
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   359
            w(self._build_edit_zone())
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   360
            w(u'</div>')
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   361
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   362
    def _add_action(self, divid, args, _edit_related, add_related, _delete_related):
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   363
        if add_related:
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   364
            w = self.w
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   365
            args['formid'] = 'edition'
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   366
            args['action'] = 'add'
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   367
            w(u'<div id="%s-add" class="editableField" onclick="%s" title="%s">' %
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   368
              (divid, xml_escape(self._onclick % args), self._cw._(self._addmsg)))
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   369
            w(self._build_add_zone())
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   370
            w(u'</div>')
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   371
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   372
    def _del_action(self, divid, args, _edit_related, _add_related, delete_related):
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   373
        if delete_related:
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   374
            w = self.w
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   375
            args['formid'] = 'deleteconf'
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   376
            args['action'] = 'delete'
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   377
            w(u'<div id="%s-delete" class="editableField" onclick="%s" title="%s">' %
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   378
              (divid, xml_escape(self._onclick % args), self._cw._(self._deletemsg)))
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   379
            w(self._build_delete_zone())
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   380
            w(u'</div>')
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   381
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   382
    def _close_form_wrapper(self):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   383
        self.w(u'</div>')
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   384
        self.w(u'</div>')
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   385
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   386
    def view_form(self, divid, value, form=None, renderer=None,
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   387
                  edit_related=False, add_related=False, delete_related=False):
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   388
        self._open_form_wrapper(divid, value, form, renderer,
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   389
                                edit_related, add_related, delete_related)
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   390
        args = form.event_args.copy()
6264
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   391
        self._edit_action(divid, args, edit_related, add_related, delete_related)
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   392
        self._add_action(divid, args, edit_related, add_related, delete_related)
0dcd19d89767 [reledit] cut methods to make overriding easier, add event on success update after reload
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6246
diff changeset
   393
        self._del_action(divid, args, edit_related, add_related, delete_related)
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   394
        self._close_form_wrapper()
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6111
diff changeset
   395
5869
8a129b3a5aff reledit refactoring
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   396
7076
0eed6045d785 [reledit] kill the reledit/doreledit duality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7070
diff changeset
   397
ClickAndEditFormView = class_renamed('ClickAndEditFormView', AutoClickAndEditFormView)
8253
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   398
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   399
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   400
@ajaxfunc(output_type='xhtml')
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   401
def reledit_form(self):
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   402
    req = self._cw
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   403
    args = dict((x, req.form[x])
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   404
                for x in ('formid', 'rtype', 'role', 'reload', 'action'))
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   405
    rset = req.eid_rset(typed_eid(self._cw.form['eid']))
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   406
    try:
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   407
        args['reload'] = json.loads(args['reload'])
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   408
    except ValueError: # not true/false, an absolute url
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   409
        assert args['reload'].startswith('http')
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   410
    view = req.vreg['views'].select('reledit', req, rset=rset, rtype=args['rtype'])
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   411
    return self._call_view(view, **args)
df7d6c57a6c8 [reledit, autoform] move reledit_form definition in reledit.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8190
diff changeset
   412