src/pyams_content/shared/view/__init__.py
changeset 337 9a3e4f9cc8f5
parent 267 9d42d0a6e945
child 405 9c147733c02e
equal deleted inserted replaced
336:d9f37252a42d 337:9a3e4f9cc8f5
    22 # import interfaces
    22 # import interfaces
    23 from hypatia.interfaces import ICatalog
    23 from hypatia.interfaces import ICatalog
    24 from pyams_content.features.preview.interfaces import IPreviewTarget
    24 from pyams_content.features.preview.interfaces import IPreviewTarget
    25 from pyams_content.features.review.interfaces import IReviewTarget
    25 from pyams_content.features.review.interfaces import IReviewTarget
    26 from pyams_content.shared.view.interfaces import IView, IWfView, IViewQuery, IViewQueryParamsExtension, \
    26 from pyams_content.shared.view.interfaces import IView, IWfView, IViewQuery, IViewQueryParamsExtension, \
    27     IViewQueryFilterExtension, VIEW_CONTENT_TYPE, VIEW_CONTENT_NAME
    27     IViewQueryFilterExtension, VIEW_CONTENT_TYPE, VIEW_CONTENT_NAME, IViewSettings
    28 from zope.intid.interfaces import IIntIds
    28 from zope.intid.interfaces import IIntIds
    29 from zope.lifecycleevent.interfaces import IObjectModifiedEvent
    29 from zope.lifecycleevent.interfaces import IObjectModifiedEvent
    30 
    30 
    31 # import packages
    31 # import packages
    32 from hypatia.catalog import CatalogQuery
    32 from hypatia.catalog import CatalogQuery
    34 from pyams_cache.beaker import get_cache
    34 from pyams_cache.beaker import get_cache
    35 from pyams_catalog.query import CatalogResultSet, or_
    35 from pyams_catalog.query import CatalogResultSet, or_
    36 from pyams_content.shared.common import WfSharedContent, register_content_type, SharedContent
    36 from pyams_content.shared.common import WfSharedContent, register_content_type, SharedContent
    37 from pyams_utils.adapter import adapter_config, ContextAdapter
    37 from pyams_utils.adapter import adapter_config, ContextAdapter
    38 from pyams_utils.list import unique
    38 from pyams_utils.list import unique
    39 from pyams_utils.registry import get_utility
    39 from pyams_utils.registry import get_utility, get_global_registry
    40 from pyams_utils.timezone import tztime
    40 from pyams_utils.timezone import tztime
    41 from pyams_workflow.interfaces import IWorkflow
    41 from pyams_workflow.interfaces import IWorkflow
    42 from pyramid.events import subscriber
    42 from pyramid.events import subscriber
    43 from pyramid.threadlocal import get_current_registry
    43 from pyramid.threadlocal import get_current_registry
    44 from zope.interface import implementer
    44 from zope.interface import implementer
    45 from zope.schema.fieldproperty import FieldProperty
    45 from zope.schema.fieldproperty import FieldProperty
    46 
    46 
    47 
    47 
    48 VIEWS_CACHE_REGION = 'views'
    48 VIEWS_CACHE_REGION = 'views'
    49 VIEWS_CACHE_NAME = 'PyAMS::view'
    49 VIEWS_CACHE_NAME = 'PyAMS::view'
    50 VIEWS_CACHE_KEY = 'view_{view}.context_{context}'
    50 
       
    51 VIEW_CACHE_KEY = 'view_{view}'
       
    52 VIEW_CONTEXT_CACHE_KEY = 'view_{view}.context_{context}'
    51 
    53 
    52 
    54 
    53 @implementer(IWfView, IPreviewTarget, IReviewTarget)
    55 @implementer(IWfView, IPreviewTarget, IReviewTarget)
    54 class WfView(WfSharedContent):
    56 class WfView(WfSharedContent):
    55     """Base view"""
    57     """Base view"""
    60     selected_content_types = FieldProperty(IWfView['selected_content_types'])
    62     selected_content_types = FieldProperty(IWfView['selected_content_types'])
    61     order_by = FieldProperty(IWfView['order_by'])
    63     order_by = FieldProperty(IWfView['order_by'])
    62     reversed_order = FieldProperty(IWfView['reversed_order'])
    64     reversed_order = FieldProperty(IWfView['reversed_order'])
    63     limit = FieldProperty(IWfView['limit'])
    65     limit = FieldProperty(IWfView['limit'])
    64 
    66 
       
    67     @property
       
    68     def is_using_context(self):
       
    69         registry = get_global_registry()
       
    70         for name, adapter in registry.getAdapters((self,), IViewSettings):
       
    71             if not name:
       
    72                 continue
       
    73             if adapter.is_using_context:
       
    74                 return True
       
    75         return False
       
    76 
    65     def get_results(self, context):
    77     def get_results(self, context):
    66         intids = get_utility(IIntIds)
    78         intids = get_utility(IIntIds)
    67         views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
    79         views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
    68         cache_key = VIEWS_CACHE_KEY.format(view=intids.queryId(self),
    80         if self.is_using_context:
    69                                            context=intids.queryId(context))
    81             cache_key = VIEW_CONTEXT_CACHE_KEY.format(view=intids.queryId(self),
       
    82                                                       context=intids.queryId(context))
       
    83         else:
       
    84             cache_key = VIEW_CACHE_KEY.format(view=intids.queryId(self))
    70         try:
    85         try:
    71             results = views_cache.get_value(cache_key)
    86             results = views_cache.get_value(cache_key)
    72         except KeyError:
    87         except KeyError:
    73             registry = get_current_registry()
    88             registry = get_current_registry()
    74             adapter = registry.queryAdapter(self, IViewQuery, name='es')
    89             adapter = registry.queryAdapter(self, IViewQuery, name='es')
   129             items = adapter.filter(context, items)
   144             items = adapter.filter(context, items)
   130         return unique(items)
   145         return unique(items)
   131 
   146 
   132 
   147 
   133 @subscriber(IObjectModifiedEvent, context_selector=IWfView)
   148 @subscriber(IObjectModifiedEvent, context_selector=IWfView)
   134 def handle_modified_view(view):
   149 def handle_modified_view(event):
   135     """Invalidate views cache when a view is modified"""
   150     """Invalidate views cache when a view is modified"""
       
   151     view = event.object
   136     views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
   152     views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
   137     views_cache.clear()
   153     if view.is_using_context:
       
   154         views_cache.clear()
       
   155     else:
       
   156         intids = get_utility(IIntIds)
       
   157         cache_key = VIEW_CACHE_KEY.format(view=intids.queryId(view))
       
   158         views_cache.remove(cache_key)