#
# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
__docformat__ = 'restructuredtext'
from pyramid.location import lineage
from zope.contentprovider.interfaces import IContentProvider
from zope.interface import implementer, Interface
from zope.location import ILocation
from zope.schema.fieldproperty import FieldProperty
from pyams_skin.interfaces.viewlet import IBreadcrumbItem, IBreadcrumbs
from pyams_skin.layer import IPyAMSLayer
from pyams_template.template import template_config
from pyams_utils.adapter import ContextRequestAdapter, adapter_config, ContextRequestViewAdapter
from pyams_utils.interfaces.tales import ITALESExtension
from pyams_utils.url import absolute_url
from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider
[docs]@implementer(IBreadcrumbItem)
class BreadcrumbItem(ContextRequestAdapter):
"""Breadcrumb item"""
label = FieldProperty(IBreadcrumbItem['label'])
css_class = FieldProperty(IBreadcrumbItem['css_class'])
view_name = FieldProperty(IBreadcrumbItem['view_name'])
@property
def url(self):
return absolute_url(self.context, self.request, self.view_name)
[docs]class BreadcrumbAdminLayerItem(BreadcrumbItem):
"""Breadcrumb item for admin layer"""
view_name = 'admin'
[docs]@adapter_config(context=(ILocation, IPyAMSLayer, Interface), provides=IBreadcrumbs)
class BreadcrumbsAdapter(ContextRequestViewAdapter):
"""Generic breadcrumbs adapter"""
[docs] def get_items(self, source):
registry = self.request.registry
for context in reversed(tuple(lineage(source))):
item = registry.queryMultiAdapter((context, self.request, self.view), IBreadcrumbItem)
if item is None:
item = registry.queryMultiAdapter((context, self.request), IBreadcrumbItem)
if item is None:
item = registry.queryAdapter(context, IBreadcrumbItem)
if item is not None:
yield item
@property
def items(self):
yield from self.get_items(self.context)
[docs]@contentprovider_config(name='pyams.breadcrumbs', layer=IPyAMSLayer, view=Interface)
@template_config(template='breadcrumbs.pt', layer=IPyAMSLayer)
class BreadcrumbsContentProvider(ViewContentProvider):
"""Breadcrumbs content provider"""
@property
def items(self):
breadcrumbs = self.request.registry.queryMultiAdapter((self.context, self.request, self.view), IBreadcrumbs)
if breadcrumbs is not None:
yield from breadcrumbs.items
[docs]@adapter_config(name='breadcrumbs', context=(Interface, Interface, Interface), provides=ITALESExtension)
class BreadcrumbsTalesExtension(ContextRequestViewAdapter):
"""tales:breadcrumbs(context) TALES extension"""
[docs] def render(self, context=None):
if context is None:
context = self.context
provider = self.request.registry.queryMultiAdapter((context, self.request, self.view), IContentProvider,
name='pyams.breadcrumbs')
if provider is not None:
provider.update()
return provider.render()
else:
return ''