src/pyams_content/shared/view/reference.py
changeset 92 3facc843c06f
parent 81 3e37d4dd8e3b
child 337 9a3e4f9cc8f5
equal deleted inserted replaced
91:87e08c0f3e3c 92:3facc843c06f
    15 
    15 
    16 # import standard library
    16 # import standard library
    17 from persistent import Persistent
    17 from persistent import Persistent
    18 
    18 
    19 # import interfaces
    19 # import interfaces
       
    20 from hypatia.interfaces import ICatalog
    20 from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IWfView, VIEW_REFERENCES_SETTINGS_KEY, \
    21 from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IWfView, VIEW_REFERENCES_SETTINGS_KEY, \
    21     IViewExtension
    22     IViewQueryFilterExtension, ALWAYS_REFERENCE_MODE
    22 from zope.annotation.interfaces import IAnnotations
    23 from zope.annotation.interfaces import IAnnotations
    23 
    24 
    24 # import packages
    25 # import packages
       
    26 from hypatia.catalog import CatalogQuery
       
    27 from hypatia.query import Any
       
    28 from pyams_catalog.query import CatalogResultSet
       
    29 from pyams_content.workflow import VISIBLE_STATES
    25 from pyams_utils.adapter import adapter_config, ContextAdapter
    30 from pyams_utils.adapter import adapter_config, ContextAdapter
       
    31 from pyams_utils.registry import get_utility
    26 from pyramid.threadlocal import get_current_registry
    32 from pyramid.threadlocal import get_current_registry
    27 from zope.container.contained import Contained
    33 from zope.container.contained import Contained
    28 from zope.interface import implementer
    34 from zope.interface import implementer
    29 from zope.lifecycleevent import ObjectCreatedEvent
    35 from zope.lifecycleevent import ObjectCreatedEvent
    30 from zope.location import locate
    36 from zope.location import locate
    34 @implementer(IViewInternalReferencesSettings)
    40 @implementer(IViewInternalReferencesSettings)
    35 class ViewInternalReferencesSettings(Persistent, Contained):
    41 class ViewInternalReferencesSettings(Persistent, Contained):
    36     """View internal references settings"""
    42     """View internal references settings"""
    37 
    43 
    38     references = FieldProperty(IViewInternalReferencesSettings['references'])
    44     references = FieldProperty(IViewInternalReferencesSettings['references'])
       
    45     references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode'])
    39 
    46 
    40 
    47 
    41 @adapter_config(context=IWfView, provides=IViewInternalReferencesSettings)
    48 @adapter_config(context=IWfView, provides=IViewInternalReferencesSettings)
    42 def ViewInternalReferencesSettingsFactory(view):
    49 def ViewInternalReferencesSettingsFactory(view):
    43     """View internal references settings factory"""
    50     """View internal references settings factory"""
    48         get_current_registry().notify(ObjectCreatedEvent(settings))
    55         get_current_registry().notify(ObjectCreatedEvent(settings))
    49         locate(settings, view, '++view:references++')
    56         locate(settings, view, '++view:references++')
    50     return settings
    57     return settings
    51 
    58 
    52 
    59 
    53 @adapter_config(name='references', context=IWfView, provides=IViewExtension)
    60 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension)
    54 class ViewInternalReferencesExtension(ContextAdapter):
    61 class ViewInternalReferencesQueryFilterExtension(ContextAdapter):
    55     """View internal references extension"""
    62     """View internal references filter extension"""
    56 
       
    57     def get_param(self, context):
       
    58         pass
       
    59 
    63 
    60     weight = 999
    64     weight = 999
    61 
    65 
    62     def filter(self, context, items):
    66     def filter(self, context, items):
       
    67         settings = IViewInternalReferencesSettings(self.context)
       
    68         if not settings.references:
       
    69             return items
       
    70         if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE):
       
    71             catalog = get_utility(ICatalog)
       
    72             params = Any(catalog['oid'], settings.references) & Any(catalog['workflow_state'], VISIBLE_STATES)
       
    73             items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params)))
    63         return items
    74         return items