web/views/treeview.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Tue, 01 Jun 2010 17:29:49 +0200
branchstable
changeset 5651 95f7285e85e2
parent 5424 8ecbcbff9777
child 5556 9ab2b4c74baf
child 5693 8af6623f3d4e
permissions -rw-r--r--
[vreg] ensure you can register an object from module not known yet. This ease registration of arbitrary objects during testing.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     1
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
928
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    18
"""Set of tree-building widgets, based on jQuery treeview plugin
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    19
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    20
"""
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    21
__docformat__ = "restructuredtext en"
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    22
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2216
diff changeset
    23
from logilab.mtconverter import xml_escape
1828
e9e8beb06f01 [treeview] really fix #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1826
diff changeset
    24
from cubicweb.utils import make_uid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
from cubicweb.interfaces import ITree
981
d86d1ee3b60e fix some imports, update treeview for 3.2
sylvain.thenault@logilab.fr
parents: 939
diff changeset
    26
from cubicweb.selectors import implements
d86d1ee3b60e fix some imports, update treeview for 3.2
sylvain.thenault@logilab.fr
parents: 939
diff changeset
    27
from cubicweb.view import EntityView
5389
809d3b5b3d31 [python2.6] careful: json-py provides a json package. We don't want that.
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5377
diff changeset
    28
from cubicweb.web import json
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
928
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    30
def treecookiename(treeid):
2391
59a2def75e93 [treeview] nicer cookie name
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2381
diff changeset
    31
    return str('%s-treestate' % treeid)
928
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
    32
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
class TreeView(EntityView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
    34
    __regid__ = 'treeview'
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    35
    itemvid = 'treeitemview'
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    36
    subvid = 'oneline'
443
3c0e9c1d645d cleanup
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    37
    css_classes = 'treeview widget'
3c0e9c1d645d cleanup
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    38
    title = _('tree view')
916
968f00dd9a24 [treeview] (in progress) use less magic, having something that now allows prepopulating a part of the tree
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 472
diff changeset
    39
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    40
    def _init_params(self, subvid, treeid, initial_load, initial_thru_ajax, morekwargs):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    41
        form = self._cw.form
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
        if subvid is None:
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    43
            subvid = form.pop('treesubvid', self.subvid) # consume it
1828
e9e8beb06f01 [treeview] really fix #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1826
diff changeset
    44
        if treeid is None:
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    45
            treeid = form.pop('treeid', None)
1828
e9e8beb06f01 [treeview] really fix #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1826
diff changeset
    46
            if treeid is None:
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    47
                treeid = 'throw_away' + make_uid('uid')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    48
        if 'morekwargs' in self._cw.form:
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    49
            ajaxargs = json.loads(form.pop('morekwargs'))
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    50
            # got unicode & python keywords must be strings
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    51
            morekwargs.update(dict((str(k), v)
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    52
                                   for k, v in ajaxargs.iteritems()))
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    53
        toplevel_thru_ajax = form.pop('treeview_top', False) or initial_thru_ajax
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    54
        toplevel = toplevel_thru_ajax or (initial_load and not form.get('fname'))
3299
cb543d6bd0e6 make it easier to subclass
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3222
diff changeset
    55
        return subvid, treeid, toplevel_thru_ajax, toplevel
cb543d6bd0e6 make it easier to subclass
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3222
diff changeset
    56
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    57
    def _init_headers(self, treeid, toplevel_thru_ajax):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    58
        self._cw.add_css('jquery.treeview.css')
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    59
        self._cw.add_js(('cubicweb.ajax.js', 'cubicweb.widgets.js', 'jquery.treeview.js'))
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    60
        self._cw.html_headers.add_onload(u"""
4851
e55bdd10421e remove deprecation warning introduced by add_onload api change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4721
diff changeset
    61
jQuery("#tree-%s").treeview({toggle: toggleTree, prerendered: true});""" % treeid)
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    62
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    63
    def call(self, subvid=None, treeid=None,
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    64
             initial_load=True, initial_thru_ajax=False, **morekwargs):
3299
cb543d6bd0e6 make it easier to subclass
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3222
diff changeset
    65
        subvid, treeid, toplevel_thru_ajax, toplevel = self._init_params(
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    66
            subvid, treeid, initial_load, initial_thru_ajax, morekwargs)
3298
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
    67
        ulid = ' '
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
    68
        if toplevel:
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    69
            self._init_headers(treeid, toplevel_thru_ajax)
3298
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
    70
            ulid = ' id="tree-%s"' % treeid
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
    71
        self.w(u'<ul%s class="%s">' % (ulid, self.css_classes))
4552
79f461d7ec37 sort on sortvalue, not dc_title to allow customization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
    72
        # XXX force sorting on x.sortvalue() (which return dc_title by default)
79f461d7ec37 sort on sortvalue, not dc_title to allow customization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
    73
        # we need proper ITree & co specification to avoid this.
79f461d7ec37 sort on sortvalue, not dc_title to allow customization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
    74
        # (pb when type ambiguity at the other side of the tree relation,
79f461d7ec37 sort on sortvalue, not dc_title to allow customization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
    75
        # unability to provide generic implementation on eg Folder...)
4436
294e084f1263 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252 4411
diff changeset
    76
        for i, entity in enumerate(sorted(self.cw_rset.entities(),
4552
79f461d7ec37 sort on sortvalue, not dc_title to allow customization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
    77
                                          key=lambda x: x.sortvalue())):
4436
294e084f1263 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252 4411
diff changeset
    78
            if i+1 < len(self.cw_rset):
4407
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    79
                morekwargs['is_last'] = False
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    80
            else:
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    81
                morekwargs['is_last'] = True
4436
294e084f1263 backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252 4411
diff changeset
    82
            entity.view(self.itemvid, vid=subvid, parentvid=self.__regid__,
4407
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    83
                        treeid=treeid, w=self.w, **morekwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
        self.w(u'</ul>')
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    85
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    86
    def cell_call(self, *args, **allargs):
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    87
        """ does not makes much sense until you have to invoke
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    88
        somentity.view('treeview') """
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    89
        allargs.pop('row')
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    90
        allargs.pop('col')
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
    91
        self.call(*args, **allargs)
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    92
4407
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    93
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    94
class FileTreeView(TreeView):
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    95
    """specific version of the treeview to display file trees
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
    96
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
    97
    __regid__ = 'filetree'
443
3c0e9c1d645d cleanup
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    98
    css_classes = 'treeview widget filetree'
3c0e9c1d645d cleanup
sylvain.thenault@logilab.fr
parents: 431
diff changeset
    99
    title = _('file tree view')
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   100
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   101
    def call(self, subvid=None, treeid=None, initial_load=True, **kwargs):
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   102
        super(FileTreeView, self).call(treeid=treeid, subvid='filetree-oneline',
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   103
                                       initial_load=initial_load, **kwargs)
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   104
443
3c0e9c1d645d cleanup
sylvain.thenault@logilab.fr
parents: 431
diff changeset
   105
class FileItemInnerView(EntityView):
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   106
    """inner view used by the TreeItemView instead of oneline view
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   107
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   108
    This view adds an enclosing <span> with some specific CSS classes
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   109
    around the oneline view. This is needed by the jquery treeview plugin.
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   110
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   111
    __regid__ = 'filetree-oneline'
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   112
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   113
    def cell_call(self, row, col):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   114
        entity = self.cw_rset.get_entity(row, col)
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   115
        if ITree.is_implemented_by(entity.__class__) and not entity.is_leaf():
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   116
            self.w(u'<div class="folder">%s</div>\n' % entity.view('oneline'))
150
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   117
        else:
1190261a1f13 provide a specific version of treeview to display files and directories
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 0
diff changeset
   118
            # XXX define specific CSS classes according to mime types
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   119
            self.w(u'<div class="file">%s</div>\n' % entity.view('oneline'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
class DefaultTreeViewItemView(EntityView):
981
d86d1ee3b60e fix some imports, update treeview for 3.2
sylvain.thenault@logilab.fr
parents: 939
diff changeset
   123
    """default treeitem view for entities which don't implement ITree"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   124
    __regid__ = 'treeitemview'
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1133
diff changeset
   125
4411
d0bde029f625 should take arbitrary arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4407
diff changeset
   126
    def cell_call(self, row, col, vid='oneline', treeid=None, **morekwargs):
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   127
        assert treeid is not None
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   128
        itemview = self._cw.view(vid, self.cw_rset, row=row, col=col)
4455
6af31772765f [views/treeview] fix non-ITree nodes last element computation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4411
diff changeset
   129
        last_class = morekwargs['is_last'] and ' class="last"' or ''
6af31772765f [views/treeview] fix non-ITree nodes last element computation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4411
diff changeset
   130
        self.w(u'<li%s>%s</li>' % (last_class, itemview))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   131
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
928
57614f333dc6 [treeview] (in progress) treeid has to be produced from outside
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 918
diff changeset
   133
class TreeViewItemView(EntityView):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
    """specific treeitem view for entities which implement ITree
916
968f00dd9a24 [treeview] (in progress) use less magic, having something that now allows prepopulating a part of the tree
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 472
diff changeset
   135
981
d86d1ee3b60e fix some imports, update treeview for 3.2
sylvain.thenault@logilab.fr
parents: 939
diff changeset
   136
    (each item should be expandable if it's not a tree leaf)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3369
diff changeset
   138
    __regid__ = 'treeitemview'
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3890 3932
diff changeset
   139
    __select__ = implements(ITree)
3298
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
   140
    default_branch_state_is_open = False
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1133
diff changeset
   141
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   142
    def open_state(self, eeid, treeid):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   143
        cookies = self._cw.get_cookie()
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   144
        treestate = cookies.get(treecookiename(treeid))
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   145
        if treestate:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   146
            return str(eeid) in treestate.value.split(';')
3298
caef98aa4a98 backport from 3.5
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2391
diff changeset
   147
        return self.default_branch_state_is_open
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   148
4407
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
   149
    def cell_call(self, row, col, treeid, vid='oneline', parentvid='treeview',
e4f921a68703 [treeview] ensure items are ordered according to their dc_title, we can't rely on an ordered rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
   150
                  is_last=False, **morekwargs):
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   151
        w = self.w
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   152
        entity = self.cw_rset.get_entity(row, col)
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   153
        liclasses = []
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   154
        is_open = self.open_state(entity.eid, treeid)
2216
b44b06520ddc [treeview] fix condition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1977
diff changeset
   155
        is_leaf = not hasattr(entity, 'is_leaf') or entity.is_leaf()
b44b06520ddc [treeview] fix condition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1977
diff changeset
   156
        if is_leaf:
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   157
            if is_last:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   158
                liclasses.append('last')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   159
            w(u'<li class="%s">' % u' '.join(liclasses))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   160
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   161
            rql = entity.children_rql() % {'x': entity.eid}
3460
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   162
            url = xml_escape(self._cw.build_url('json', rql=rql, vid=parentvid,
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   163
                                                pageid=self._cw.pageid,
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   164
                                                treeid=treeid,
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   165
                                                fname='view',
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   166
                                                treesubvid=vid,
e4843535db25 [api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3451
diff changeset
   167
                                                morekwargs=json.dumps(morekwargs)))
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   168
            divclasses = ['hitarea']
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   169
            if is_open:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   170
                liclasses.append('collapsable')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   171
                divclasses.append('collapsable-hitarea')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   172
            else:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   173
                liclasses.append('expandable')
1828
e9e8beb06f01 [treeview] really fix #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1826
diff changeset
   174
                divclasses.append('expandable-hitarea')
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   175
            if is_last:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   176
                if is_open:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   177
                    liclasses.append('lastCollapsable')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   178
                    divclasses.append('lastCollapsable-hitarea')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   179
                else:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   180
                    liclasses.append('lastExpandable')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   181
                    divclasses.append('lastExpandable-hitarea')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   182
            if is_open:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   183
                w(u'<li class="%s">' % u' '.join(liclasses))
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   184
            else:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   185
                w(u'<li cubicweb:loadurl="%s" class="%s">' % (url, u' '.join(liclasses)))
3320
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   186
            if treeid.startswith('throw_away'):
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   187
                divtail = ''
0dc8b2d46a53 more in the way of subclassability & args passing all the way down
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3311
diff changeset
   188
            else:
4721
8f63691ccb7f pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   189
                divtail = """ onclick="asyncRemoteExec('node_clicked', '%s', '%s')" """ % (
8f63691ccb7f pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   190
                    treeid, entity.eid)
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   191
            w(u'<div class="%s"%s></div>' % (u' '.join(divclasses), divtail))
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   192
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
            # add empty <ul> because jquery's treeview plugin checks for
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
            # sublists presence
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   195
            if not is_open:
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   196
                w(u'<ul class="placeholder"><li>place holder</li></ul>')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   197
        # the local node info
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   198
        self.wview(vid, self.cw_rset, row=row, col=col, **morekwargs)
2216
b44b06520ddc [treeview] fix condition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1977
diff changeset
   199
        if is_open and not is_leaf: #  => rql is defined
3888
6f145783409d use ITree api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3596
diff changeset
   200
            self.wview(parentvid, entity.children(entities=False), subvid=vid,
6f145783409d use ITree api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3596
diff changeset
   201
                       treeid=treeid, initial_load=False, **morekwargs)
1826
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   202
        w(u'</li>')
afc563537d8f [treeview] restore functionnality lost in some previous merge #343232
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1802
diff changeset
   203