src/pyams_content/shared/view/portlet/__init__.py
changeset 1171 41310cefa42a
parent 1167 04429c162338
child 1223 99a4c33e2962
--- 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)