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 |