src/pyams_skin/viewlet/breadcrumb/__init__.py
changeset 468 8c6bd0ac6424
parent 401 5220ef7b83d6
equal deleted inserted replaced
467:c571dce459a3 468:8c6bd0ac6424
    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 ''