--- a/src/pyams_content/shared/view/portlet/__init__.py Fri Dec 14 11:59:12 2018 +0100
+++ b/src/pyams_content/shared/view/portlet/__init__.py Fri Dec 14 13:32:54 2018 +0100
@@ -12,14 +12,16 @@
__docformat__ = 'restructuredtext'
-from itertools import islice
+from itertools import islice, tee
from zope.schema.fieldproperty import FieldProperty
from pyams_content.shared.view.interfaces import IViewsManager, IViewsMerger
-from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings, VIEW_DISPLAY_CONTEXT
+from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings, VIEW_DISPLAY_CONTEXT, \
+ SEARCH_EXCLUDED_ITEMS
from pyams_portal.interfaces import PREVIEW_MODE
from pyams_portal.portlet import Portlet, PortletSettings, portlet_config
+from pyams_sequence.interfaces import ISequentialIdInfo
from pyams_sequence.reference import get_sequence_target
from pyams_utils.factory import factory_config
from pyams_utils.interfaces import VIEW_PERMISSION
@@ -45,6 +47,7 @@
views_merge_mode = FieldProperty(IViewItemsPortletSettings['views_merge_mode'])
limit = FieldProperty(IViewItemsPortletSettings['limit'])
start = FieldProperty(IViewItemsPortletSettings['start'])
+ exclude_from_search = FieldProperty(IViewItemsPortletSettings['exclude_from_search'])
def get_views(self):
views_manager = get_utility(IViewsManager)
@@ -71,12 +74,18 @@
merger = self.get_merger(request)
if merger is not None:
start = int(request.params.get('start', 0))
- yield from islice(unique_iter(merger.get_results(self.get_views(),
- context,
- ignore_cache=ignore_cache,
- request=request)),
- start + (self.start or 1) - 1,
- min(limit or 999, self.limit or 999))
+ items = islice(unique_iter(merger.get_results(self.get_views(),
+ context,
+ ignore_cache=ignore_cache,
+ request=request)),
+ start + (self.start or 1) - 1,
+ min(limit or 999, self.limit or 999))
+ if (request is not None) and self.exclude_from_search:
+ (excluded, items) = tee(items)
+ excluded_items = request.annotations.get(SEARCH_EXCLUDED_ITEMS) or set()
+ excluded_items |= set((ISequentialIdInfo(item).hex_oid for item in excluded))
+ request.annotations[SEARCH_EXCLUDED_ITEMS] = excluded_items
+ yield from items
@portlet_config(permission=VIEW_PERMISSION)