--- 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