10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
12 |
12 |
13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
|
15 from pyramid.location import lineage |
|
16 from zope.contentprovider.interfaces import IContentProvider |
|
17 from zope.interface import implementer, Interface |
|
18 from zope.location import ILocation |
|
19 from zope.schema.fieldproperty import FieldProperty |
15 |
20 |
16 # import standard library |
21 from pyams_skin.interfaces.viewlet import IBreadcrumbItem, IBreadcrumbs |
17 |
|
18 # import interfaces |
|
19 from pyams_skin.interfaces.viewlet import IBreadcrumbItem |
|
20 from pyams_skin.layer import IPyAMSLayer |
22 from pyams_skin.layer import IPyAMSLayer |
21 |
|
22 # import packages |
|
23 from pyams_template.template import template_config |
23 from pyams_template.template import template_config |
24 from pyams_utils.adapter import ContextRequestAdapter |
24 from pyams_utils.adapter import ContextRequestAdapter, adapter_config, ContextRequestViewAdapter |
|
25 from pyams_utils.interfaces.tales import ITALESExtension |
25 from pyams_utils.url import absolute_url |
26 from pyams_utils.url import absolute_url |
26 from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider |
27 from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider |
27 from pyramid.location import lineage |
|
28 from zope.interface import implementer, Interface |
|
29 from zope.schema.fieldproperty import FieldProperty |
|
30 |
28 |
31 |
29 |
32 @implementer(IBreadcrumbItem) |
30 @implementer(IBreadcrumbItem) |
33 class BreadcrumbItem(ContextRequestAdapter): |
31 class BreadcrumbItem(ContextRequestAdapter): |
34 """Breadcrumb item""" |
32 """Breadcrumb item""" |
46 """Breadcrumb item for admin layer""" |
44 """Breadcrumb item for admin layer""" |
47 |
45 |
48 view_name = 'admin' |
46 view_name = 'admin' |
49 |
47 |
50 |
48 |
|
49 @adapter_config(context=(ILocation, IPyAMSLayer, Interface), provides=IBreadcrumbs) |
|
50 class BreadcrumbsAdapter(ContextRequestViewAdapter): |
|
51 """Generic breadcrumbs adapter""" |
|
52 |
|
53 def get_items(self, source): |
|
54 registry = self.request.registry |
|
55 for context in reversed(tuple(lineage(source))): |
|
56 item = registry.queryMultiAdapter((context, self.request, self.view), IBreadcrumbItem) |
|
57 if item is None: |
|
58 item = registry.queryMultiAdapter((context, self.request), IBreadcrumbItem) |
|
59 if item is None: |
|
60 item = registry.queryAdapter(context, IBreadcrumbItem) |
|
61 if item is not None: |
|
62 yield item |
|
63 |
|
64 @property |
|
65 def items(self): |
|
66 yield from self.get_items(self.context) |
|
67 |
|
68 |
51 @contentprovider_config(name='pyams.breadcrumbs', layer=IPyAMSLayer, view=Interface) |
69 @contentprovider_config(name='pyams.breadcrumbs', layer=IPyAMSLayer, view=Interface) |
52 @template_config(template='breadcrumbs.pt', layer=IPyAMSLayer) |
70 @template_config(template='breadcrumbs.pt', layer=IPyAMSLayer) |
53 class BreadcrumbsContentProvider(ViewContentProvider): |
71 class BreadcrumbsContentProvider(ViewContentProvider): |
54 """Breadcrumbs content provider""" |
72 """Breadcrumbs content provider""" |
55 |
73 |
56 @property |
74 @property |
57 def items(self): |
75 def items(self): |
58 registry = self.request.registry |
76 breadcrumbs = self.request.registry.queryMultiAdapter((self.context, self.request, self.view), IBreadcrumbs) |
59 for context in reversed(tuple(lineage(self.context))): |
77 if breadcrumbs is not None: |
60 item = registry.queryMultiAdapter((context, self.request, self.view), IBreadcrumbItem) |
78 yield from breadcrumbs.items |
61 if item is None: |
79 |
62 item = registry.queryMultiAdapter((context, self.request), IBreadcrumbItem) |
80 |
63 if item is None: |
81 @adapter_config(name='breadcrumbs', context=(Interface, Interface, Interface), provides=ITALESExtension) |
64 item = registry.queryAdapter(context, IBreadcrumbItem) |
82 class BreadcrumbsTalesExtension(ContextRequestViewAdapter): |
65 if item is not None: |
83 """tales:breadcrumbs(context) TALES extension""" |
66 yield item |
84 |
|
85 def render(self, context=None): |
|
86 if context is None: |
|
87 context = self.context |
|
88 provider = self.request.registry.queryMultiAdapter((context, self.request, self.view), IContentProvider, |
|
89 name='pyams.breadcrumbs') |
|
90 if provider is not None: |
|
91 provider.update() |
|
92 return provider.render() |
|
93 else: |
|
94 return '' |