src/pyams_content/shared/view/reference.py
changeset 92 3facc843c06f
parent 81 3e37d4dd8e3b
child 337 9a3e4f9cc8f5
--- a/src/pyams_content/shared/view/reference.py	Tue Jun 27 11:47:34 2017 +0200
+++ b/src/pyams_content/shared/view/reference.py	Tue Jun 27 11:49:01 2017 +0200
@@ -17,12 +17,18 @@
 from persistent import Persistent
 
 # import interfaces
+from hypatia.interfaces import ICatalog
 from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IWfView, VIEW_REFERENCES_SETTINGS_KEY, \
-    IViewExtension
+    IViewQueryFilterExtension, ALWAYS_REFERENCE_MODE
 from zope.annotation.interfaces import IAnnotations
 
 # import packages
+from hypatia.catalog import CatalogQuery
+from hypatia.query import Any
+from pyams_catalog.query import CatalogResultSet
+from pyams_content.workflow import VISIBLE_STATES
 from pyams_utils.adapter import adapter_config, ContextAdapter
+from pyams_utils.registry import get_utility
 from pyramid.threadlocal import get_current_registry
 from zope.container.contained import Contained
 from zope.interface import implementer
@@ -36,6 +42,7 @@
     """View internal references settings"""
 
     references = FieldProperty(IViewInternalReferencesSettings['references'])
+    references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode'])
 
 
 @adapter_config(context=IWfView, provides=IViewInternalReferencesSettings)
@@ -50,14 +57,18 @@
     return settings
 
 
-@adapter_config(name='references', context=IWfView, provides=IViewExtension)
-class ViewInternalReferencesExtension(ContextAdapter):
-    """View internal references extension"""
-
-    def get_param(self, context):
-        pass
+@adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension)
+class ViewInternalReferencesQueryFilterExtension(ContextAdapter):
+    """View internal references filter extension"""
 
     weight = 999
 
     def filter(self, context, items):
+        settings = IViewInternalReferencesSettings(self.context)
+        if not settings.references:
+            return items
+        if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE):
+            catalog = get_utility(ICatalog)
+            params = Any(catalog['oid'], settings.references) & Any(catalog['workflow_state'], VISIBLE_STATES)
+            items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params)))
         return items