web/views/ibreadcrumbs.py
branchstable
changeset 9542 79b9bf88be28
parent 9384 430859af32c6
child 10006 8391bf718485
equal deleted inserted replaced
9540:43b4895a150f 9542:79b9bf88be28
    22 
    22 
    23 from warnings import warn
    23 from warnings import warn
    24 
    24 
    25 from logilab.mtconverter import xml_escape
    25 from logilab.mtconverter import xml_escape
    26 
    26 
    27 #from cubicweb.interfaces import IBreadCrumbs
       
    28 from cubicweb import tags, uilib
    27 from cubicweb import tags, uilib
    29 from cubicweb.entity import Entity
    28 from cubicweb.entity import Entity
    30 from cubicweb.predicates import (is_instance, one_line_rset, adaptable,
    29 from cubicweb.predicates import (is_instance, one_line_rset, adaptable,
    31                                 one_etype_rset, multi_lines_rset, any_rset,
    30                                 one_etype_rset, multi_lines_rset, any_rset,
    32                                 match_form_params)
    31                                 match_form_params)
    33 from cubicweb.view import EntityView, EntityAdapter
    32 from cubicweb.view import EntityView, EntityAdapter
    34 from cubicweb.web.views import basecomponents
    33 from cubicweb.web.views import basecomponents
    35 # don't use AnyEntity since this may cause bug with isinstance() due to reloading
    34 # don't use AnyEntity since this may cause bug with isinstance() due to reloading
    36 
    35 
    37 
    36 
    38 # ease bw compat
       
    39 def ibreadcrumb_adapter(entity):
       
    40     if hasattr(entity, 'breadcrumbs'):
       
    41         warn('[3.9] breadcrumbs() method is deprecated, define a custom '
       
    42              'IBreadCrumbsAdapter for %s instead' % entity.__class__,
       
    43              DeprecationWarning)
       
    44         return entity
       
    45     return entity.cw_adapt_to('IBreadCrumbs')
       
    46 
       
    47 
    37 
    48 class IBreadCrumbsAdapter(EntityAdapter):
    38 class IBreadCrumbsAdapter(EntityAdapter):
    49     """adapters for entities which can be"located" on some path to display in
    39     """adapters for entities which can be"located" on some path to display in
    50     the web ui
    40     the web ui
    51     """
    41     """
    52     __regid__ = 'IBreadCrumbs'
    42     __regid__ = 'IBreadCrumbs'
    53     __select__ = is_instance('Any', accept_none=False)
    43     __select__ = is_instance('Any', accept_none=False)
    54 
    44 
    55     def parent_entity(self):
    45     def parent_entity(self):
    56         if hasattr(self.entity, 'parent') and callable(self.entity.parent):
       
    57             warn('[3.9] parent() method is deprecated, define a '
       
    58                  'custom IBreadCrumbsAdapter/ITreeAdapter for %s instead'
       
    59                  % self.entity.__class__, DeprecationWarning)
       
    60             return self.entity.parent()
       
    61         itree = self.entity.cw_adapt_to('ITree')
    46         itree = self.entity.cw_adapt_to('ITree')
    62         if itree is not None:
    47         if itree is not None:
    63             return itree.parent()
    48             return itree.parent()
    64         return None
    49         return None
    65 
    50 
    92                 _recurs = set()
    77                 _recurs = set()
    93             if _recurs and parent.eid in _recurs:
    78             if _recurs and parent.eid in _recurs:
    94                 self.error('cycle in breadcrumbs for entity %s' % self.entity)
    79                 self.error('cycle in breadcrumbs for entity %s' % self.entity)
    95                 return []
    80                 return []
    96             _recurs.add(parent.eid)
    81             _recurs.add(parent.eid)
    97             adapter = ibreadcrumb_adapter(parent)
    82             adapter = parent.cw_adapt_to('IBreadCrumbs')
    98             path = adapter.breadcrumbs(view, _recurs) + [self.entity]
    83             path = adapter.breadcrumbs(view, _recurs) + [self.entity]
    99         else:
    84         else:
   100             path = [self.entity]
    85             path = [self.entity]
   101         if not recurs:
    86         if not recurs:
   102             if view is None:
    87             if view is None:
   123     def render(self, w, **kwargs):
   108     def render(self, w, **kwargs):
   124         try:
   109         try:
   125             entity = self.cw_extra_kwargs['entity']
   110             entity = self.cw_extra_kwargs['entity']
   126         except KeyError:
   111         except KeyError:
   127             entity = self.cw_rset.get_entity(0, 0)
   112             entity = self.cw_rset.get_entity(0, 0)
   128         adapter = ibreadcrumb_adapter(entity)
   113         adapter = entity.cw_adapt_to('IBreadCrumbs')
   129         view = self.cw_extra_kwargs.get('view')
   114         view = self.cw_extra_kwargs.get('view')
   130         path = adapter.breadcrumbs(view)
   115         path = adapter.breadcrumbs(view)
   131         if path:
   116         if path:
   132             self.open_breadcrumbs(w)
   117             self.open_breadcrumbs(w)
   133             if self.first_separator:
       
   134                 w(self.separator)
       
   135             self.render_breadcrumbs(w, entity, path)
   118             self.render_breadcrumbs(w, entity, path)
   136             self.close_breadcrumbs(w)
   119             self.close_breadcrumbs(w)
   137 
   120 
   138     def open_breadcrumbs(self, w):
   121     def open_breadcrumbs(self, w):
   139         w(u'<span id="breadcrumbs" class="pathbar">')
   122         w(u'<span id="breadcrumbs" class="pathbar">')
       
   123         if self.first_separator:
       
   124             w(self.separator)
   140 
   125 
   141     def close_breadcrumbs(self, w):
   126     def close_breadcrumbs(self, w):
   142         w(u'</span>')
   127         w(u'</span>')
   143 
   128 
   144     def render_breadcrumbs(self, w, contextentity, path):
   129     def render_breadcrumbs(self, w, contextentity, path):
   185     __select__ = basecomponents.HeaderComponent.__select__ & any_rset()
   170     __select__ = basecomponents.HeaderComponent.__select__ & any_rset()
   186 
   171 
   187     # XXX support kwargs for compat with other components which gets the view as
   172     # XXX support kwargs for compat with other components which gets the view as
   188     # argument
   173     # argument
   189     def render(self, w, **kwargs):
   174     def render(self, w, **kwargs):
   190         w(u'<span id="breadcrumbs" class="pathbar">')
   175         self.open_breadcrumbs(w)
   191         if self.first_separator:
       
   192             w(self.separator)
       
   193         w(self._cw._('search'))
   176         w(self._cw._('search'))
   194         w(u'</span>')
   177         self.close_breadcrumbs(w)
   195 
   178 
   196 
   179 
   197 class BreadCrumbLinkToVComponent(BreadCrumbEntityVComponent):
   180 class BreadCrumbLinkToVComponent(BreadCrumbEntityVComponent):
   198     __select__ = basecomponents.HeaderComponent.__select__ & match_form_params('__linkto')
   181     __select__ = basecomponents.HeaderComponent.__select__ & match_form_params('__linkto')
   199 
   182