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