web/views/ibreadcrumbs.py
author Aurelien Campeas <aurelien.campeas@logilab.fr>
Mon, 26 Aug 2013 16:14:09 +0200
changeset 9256 697a8181ba30
parent 8190 2a3c1b787688
child 9384 430859af32c6
permissions -rw-r--r--
remove 3.9 bw compat In cw 3.9, interfaces are deprecated and replaced with adapters, yielding a lot of bw compat in many places -- most if this patch is concerned with the interface bw compat - cwvreg: interface cleanup - doc/adapters.rst: interface cleanup - entities/adapters.py, wfobjs.py: interfaces bw compat - entity.py: interfaces bw compat, also get_value, delete, attr_metadata, has_perm, set_related_cache, clear_related_cache, clear_related_cache, related_rql - predicates.py: score_interfaces & implements - interfaces.py & mixins.py: 100% gone - view.py: implement_adapter_compat, unwrap_adapter_compat - calendar.py, editcontroller.py, ibreadcrumbs.py, navigation.py, xmlrss.py: interface bw compat - treeview.py: salvage one function from mixins.py Related to #2782004.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7101
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
     1
# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
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: 5291
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5722
61d6a4caa963 [iprogress] move adapter to entities.adapters
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5569
diff changeset
    18
"""breadcrumbs components definition for CubicWeb web client"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
__docformat__ = "restructuredtext en"
1882
ce662160bb46 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1802
diff changeset
    21
_ = unicode
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    23
from warnings import warn
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    24
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
    25
from logilab.mtconverter import xml_escape
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    27
from cubicweb import tags, uilib
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    28
from cubicweb.entity import Entity
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7979
diff changeset
    29
from cubicweb.predicates import (is_instance, one_line_rset, adaptable,
7841
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
    30
                                one_etype_rset, multi_lines_rset, any_rset,
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
    31
                                match_form_params)
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    32
from cubicweb.view import EntityView, EntityAdapter
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    33
from cubicweb.web.views import basecomponents
713
5adb6d8e5fa7 update imports of "cubicweb.common.entity" and use the new module path "cubicweb.entity"
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 692
diff changeset
    34
# don't use AnyEntity since this may cause bug with isinstance() due to reloading
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    37
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    38
class IBreadCrumbsAdapter(EntityAdapter):
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    39
    """adapters for entities which can be"located" on some path to display in
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    40
    the web ui
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    41
    """
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    42
    __regid__ = 'IBreadCrumbs'
5877
0c7b7b76a84f [selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5722
diff changeset
    43
    __select__ = is_instance('Any', accept_none=False)
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    44
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    45
    def parent_entity(self):
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    46
        itree = self.entity.cw_adapt_to('ITree')
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    47
        if itree is not None:
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    48
            return itree.parent()
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    49
        return None
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    50
6430
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    51
    def breadcrumbs(self, view=None, recurs=None):
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    52
        """return a list containing some:
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    53
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    54
        * tuple (url, label)
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    55
        * entity
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    56
        * simple label string
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    57
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    58
        defining path from a root to the current view
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    59
6430
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    60
        the main view is given as argument so breadcrumbs may vary according to
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    61
        displayed view (may be None). When recursing on a parent entity, the
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    62
        `recurs` argument should be a set of already traversed nodes (infinite
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    63
        loop safety belt).
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    64
        """
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    65
        parent = self.parent_entity()
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    66
        if parent is not None:
6451
f64899fa0b5c fix pre 3.10 bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6431
diff changeset
    67
            if recurs is True:
f64899fa0b5c fix pre 3.10 bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6431
diff changeset
    68
                _recurs = set()
f64899fa0b5c fix pre 3.10 bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6431
diff changeset
    69
                warn('[3.10] recurs argument should be a set() or None',
f64899fa0b5c fix pre 3.10 bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6431
diff changeset
    70
                     DeprecationWarning, stacklevel=2)
f64899fa0b5c fix pre 3.10 bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6431
diff changeset
    71
            elif recurs:
6430
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    72
                _recurs = recurs
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    73
            else:
6431
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6430
diff changeset
    74
                if recurs is False:
6430
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    75
                    warn('[3.10] recurs argument should be a set() or None',
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    76
                         DeprecationWarning, stacklevel=2)
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    77
                _recurs = set()
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    78
            if _recurs and parent.eid in _recurs:
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    79
                self.error('cycle in breadcrumbs for entity %s' % self.entity)
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    80
                return []
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    81
            _recurs.add(parent.eid)
9256
697a8181ba30 remove 3.9 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8190
diff changeset
    82
            adapter = parent.cw_adapt_to('IBreadCrumbs')
6430
dc4398d094be [breadcrumb] infinite loop safety belt, bw compatible by hi-jacking 'recurs' argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6428
diff changeset
    83
            path = adapter.breadcrumbs(view, _recurs) + [self.entity]
5569
cb14af012a96 [adapters] refactoring fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5556
diff changeset
    84
        else:
cb14af012a96 [adapters] refactoring fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5556
diff changeset
    85
            path = [self.entity]
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    86
        if not recurs:
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    87
            if view is None:
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    88
                if 'vtitle' in self._cw.form:
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    89
                    # embeding for instance
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    90
                    path.append( self._cw.form['vtitle'] )
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    91
            elif view.__regid__ != 'primary' and hasattr(view, 'title'):
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    92
                path.append( self._cw._(view.title) )
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    93
        return path
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    94
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    95
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    96
class BreadCrumbEntityVComponent(basecomponents.HeaderComponent):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3185
diff changeset
    97
    __regid__ = 'breadcrumbs'
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    98
    __select__ = (basecomponents.HeaderComponent.__select__
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
    99
                  & one_line_rset() & adaptable('IBreadCrumbs'))
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   100
    order = basecomponents.ApplicationName.order + 1
6698
b353e868b74f [basetemplates] breadcrumbs component context sticks to ApplicationName
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6451
diff changeset
   101
    context = basecomponents.ApplicationName.context
2996
866a2c135c33 B #345282 xhtml requires to use &#160; instead of &nbsp;
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2312
diff changeset
   102
    separator = u'&#160;&gt;&#160;'
3862
4908c7156eab [breadcrumbs] make it easier to redefine html structure of breadcrumbs component
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3523
diff changeset
   103
    link_template = u'<a href="%s">%s</a>'
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   104
    first_separator = True
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
7101
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   106
    # XXX support kwargs for compat with other components which gets the view as
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   107
    # argument
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   108
    def render(self, w, **kwargs):
7841
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   109
        try:
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   110
            entity = self.cw_extra_kwargs['entity']
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   111
        except KeyError:
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   112
            entity = self.cw_rset.get_entity(0, 0)
9256
697a8181ba30 remove 3.9 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8190
diff changeset
   113
        adapter = entity.cw_adapt_to('IBreadCrumbs')
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   114
        view = self.cw_extra_kwargs.get('view')
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
   115
        path = adapter.breadcrumbs(view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
        if path:
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   117
            self.open_breadcrumbs(w)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   118
            if self.first_separator:
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   119
                w(self.separator)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   120
            self.render_breadcrumbs(w, entity, path)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   121
            self.close_breadcrumbs(w)
3862
4908c7156eab [breadcrumbs] make it easier to redefine html structure of breadcrumbs component
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3523
diff changeset
   122
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   123
    def open_breadcrumbs(self, w):
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   124
        w(u'<span id="breadcrumbs" class="pathbar">')
3862
4908c7156eab [breadcrumbs] make it easier to redefine html structure of breadcrumbs component
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3523
diff changeset
   125
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   126
    def close_breadcrumbs(self, w):
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   127
        w(u'</span>')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 984
diff changeset
   128
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   129
    def render_breadcrumbs(self, w, contextentity, path):
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   130
        root = path.pop(0)
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   131
        if isinstance(root, Entity):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   132
            w(self.link_template % (self._cw.build_url(root.__regid__),
3862
4908c7156eab [breadcrumbs] make it easier to redefine html structure of breadcrumbs component
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3523
diff changeset
   133
                                         root.dc_type('plural')))
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   134
            w(self.separator)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   135
        self.wpath_part(w, root, contextentity, not path)
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   136
        for i, parent in enumerate(path):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   137
            w(self.separator)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   138
            w(u"\n")
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   139
            self.wpath_part(w, parent, contextentity, i == len(path) - 1)
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   140
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   141
    def wpath_part(self, w, part, contextentity, last=False): # XXX deprecates last argument?
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        if isinstance(part, Entity):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   143
            w(part.view('breadcrumbs'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
        elif isinstance(part, tuple):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
            url, title = part
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3407
diff changeset
   146
            textsize = self._cw.property_value('navigation.short-line-size')
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   147
            w(self.link_template % (
3179
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   148
                xml_escape(url), xml_escape(uilib.cut(title, textsize))))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
        else:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3407
diff changeset
   150
            textsize = self._cw.property_value('navigation.short-line-size')
7976
48e1f7992507 [ibreadcrumbs] missing xml_escape on latest path part (usually view's title). Closes #2037506
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   151
            w(xml_escape(uilib.cut(unicode(part), textsize)))
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 984
diff changeset
   152
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   154
class BreadCrumbETypeVComponent(BreadCrumbEntityVComponent):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   155
    __select__ = (basecomponents.HeaderComponent.__select__
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   156
                  & multi_lines_rset() & one_etype_rset()
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   157
                  & adaptable('IBreadCrumbs'))
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   158
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   159
    def render_breadcrumbs(self, w, contextentity, path):
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   160
        # XXX hack: only display etype name or first non entity path part
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   161
        root = path.pop(0)
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   162
        if isinstance(root, Entity):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   163
            w(u'<a href="%s">%s</a>' % (self._cw.build_url(root.__regid__),
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   164
                                        root.dc_type('plural')))
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   165
        else:
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   166
            self.wpath_part(w, root, contextentity, not path)
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   167
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   168
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   169
class BreadCrumbAnyRSetVComponent(BreadCrumbEntityVComponent):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   170
    __select__ = basecomponents.HeaderComponent.__select__ & any_rset()
3007
a15e982aa9a3 [breadcrumb] only provides a breadcrumbs component, no more as pluggable content nav comp; provides alternative implentation for rset with more than one entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2996
diff changeset
   171
7101
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   172
    # XXX support kwargs for compat with other components which gets the view as
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   173
    # argument
de388d0b727e [components] add **kwargs to render method of header components to make them usable as regular components (eg in other places than the header
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6920
diff changeset
   174
    def render(self, w, **kwargs):
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   175
        w(u'<span id="breadcrumbs" class="pathbar">')
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   176
        if self.first_separator:
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   177
            w(self.separator)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   178
        w(self._cw._('search'))
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   179
        w(u'</span>')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   180
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   181
7841
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   182
class BreadCrumbLinkToVComponent(BreadCrumbEntityVComponent):
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   183
    __select__ = basecomponents.HeaderComponent.__select__ & match_form_params('__linkto')
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   184
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   185
    def render(self, w, **kwargs):
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   186
        eid = self._cw.list_form_param('__linkto')[0].split(':')[1]
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   187
        entity = self._cw.entity_from_eid(eid)
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   188
        ecmp = self._cw.vreg[self.__registry__].select(
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   189
            self.__regid__, self._cw, entity=entity, **kwargs)
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   190
        ecmp.render(w, **kwargs)
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   191
287813c487b7 [breadcrumbs] keep proper breadcrumbs when creating an entity linked to another by inspecting __linkto (closes #1947476)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7511
diff changeset
   192
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
class BreadCrumbView(EntityView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3185
diff changeset
   194
    __regid__ = 'breadcrumbs'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
4802
fa2297d6542a [views/breadcrumbs] fix bad signature
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4320
diff changeset
   196
    def cell_call(self, row, col, **kwargs):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3407
diff changeset
   197
        entity = self.cw_rset.get_entity(row, col)
7511
dfe6c25c6371 [breadcrumbs] closes #1717489: Double escaping in breadcrumbs
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7103
diff changeset
   198
        desc = uilib.cut(entity.dc_description(), 50)
7103
9acffa1ecb2f cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7101
diff changeset
   199
        # NOTE remember camember: tags.a autoescapes
3179
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   200
        self.w(tags.a(entity.view('breadcrumbtext'),
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   201
                      href=entity.absolute_url(), title=desc))
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   202
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   203
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   204
class BreadCrumbTextView(EntityView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3185
diff changeset
   205
    __regid__ = 'breadcrumbtext'
3179
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   206
4802
fa2297d6542a [views/breadcrumbs] fix bad signature
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4320
diff changeset
   207
    def cell_call(self, row, col, **kwargs):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3407
diff changeset
   208
        entity = self.cw_rset.get_entity(row, col)
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3407
diff changeset
   209
        textsize = self._cw.property_value('navigation.short-line-size')
3179
0684544f6d0d from 3.5 branch; XXX the test depends on an eid value
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3030
diff changeset
   210
        self.w(uilib.cut(entity.dc_title(), textsize))