src/pyams_content/shared/view/portlet/__init__.py
changeset 783 e34cc04e9786
parent 691 773429b4a3ed
child 796 2ef3bacda742
equal deleted inserted replaced
782:bfdfb25e2f9e 783:e34cc04e9786
    12 
    12 
    13 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
    14 
    14 
    15 
    15 
    16 # import standard library
    16 # import standard library
       
    17 from itertools import islice
    17 
    18 
    18 # import interfaces
    19 # import interfaces
    19 from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings
    20 from pyams_content.shared.view.interfaces import IViewsMerger
       
    21 from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings, VIEW_DISPLAY_CONTEXT
    20 from pyams_utils.interfaces import VIEW_PERMISSION
    22 from pyams_utils.interfaces import VIEW_PERMISSION
       
    23 from pyams_utils.interfaces.url import DISPLAY_CONTEXT
    21 
    24 
    22 # import packages
    25 # import packages
    23 from pyams_content.workflow import PUBLISHED_STATES
    26 from pyams_content.workflow import PUBLISHED_STATES
    24 from pyams_portal.portlet import PortletSettings, portlet_config, Portlet
    27 from pyams_portal.portlet import PortletSettings, portlet_config, Portlet
    25 from pyams_sequence.utility import get_sequence_target
    28 from pyams_sequence.utility import get_sequence_target
    26 from pyams_utils.factory import factory_config
    29 from pyams_utils.factory import factory_config
       
    30 from pyams_utils.list import unique_iter
       
    31 from pyams_utils.request import check_request
    27 from zope.interface import implementer
    32 from zope.interface import implementer
    28 from zope.schema.fieldproperty import FieldProperty
    33 from zope.schema.fieldproperty import FieldProperty
    29 
    34 
    30 from pyams_content import _
    35 from pyams_content import _
    31 
    36 
    36 @implementer(IViewItemsPortletSettings)
    41 @implementer(IViewItemsPortletSettings)
    37 @factory_config(provided=IViewItemsPortletSettings)
    42 @factory_config(provided=IViewItemsPortletSettings)
    38 class ViewItemsPortletSettings(PortletSettings):
    43 class ViewItemsPortletSettings(PortletSettings):
    39     """View items portlet settings"""
    44     """View items portlet settings"""
    40 
    45 
    41     view = FieldProperty(IViewItemsPortletSettings['view'])
    46     views = FieldProperty(IViewItemsPortletSettings['views'])
       
    47     views_context = FieldProperty(IViewItemsPortletSettings['views_context'])
       
    48     views_merge_mode = FieldProperty(IViewItemsPortletSettings['views_merge_mode'])
       
    49     limit = FieldProperty(IViewItemsPortletSettings['limit'])
    42 
    50 
    43     def get_view(self):
    51     def get_merger(self, request=None):
    44         if self.view is not None:
    52         if request is None:
    45             return get_sequence_target(self.view, state=PUBLISHED_STATES)
    53             request = check_request()
       
    54         return request.registry.queryUtility(IViewsMerger, name=self.views_merge_mode)
    46 
    55 
    47     def get_items(self, context):
    56     def get_views(self):
    48         view = self.get_view()
    57         for oid in self.views or ():
    49         if view is not None:
    58             view = get_sequence_target(oid, state=PUBLISHED_STATES)
    50             return view.get_results(context)
    59             if view is not None:
       
    60                 yield view
       
    61 
       
    62     def get_items(self, request=None):
       
    63         if request is None:
       
    64             request = check_request()
       
    65         if self.views_context == VIEW_DISPLAY_CONTEXT:
       
    66             context = request.annotations.get(DISPLAY_CONTEXT, request.root)
       
    67         else:
       
    68             context = request.context
       
    69         if len(self.views or ()) < 2:  # single view
       
    70             for view in self.get_views():
       
    71                 if view is not None:
       
    72                     yield from islice(view.get_results(context), self.limit)
       
    73         else:  # several views merged together
       
    74             merger = self.get_merger(request)
       
    75             if merger is not None:
       
    76                 yield from islice(unique_iter(merger.get_results(self.get_views(), context)), self.limit)
    51 
    77 
    52 
    78 
    53 @portlet_config(permission=VIEW_PERMISSION)
    79 @portlet_config(permission=VIEW_PERMISSION)
    54 class ViewItemsPortlet(Portlet):
    80 class ViewItemsPortlet(Portlet):
    55     """View items portlet"""
    81     """View items portlet"""