7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
12 from pyams_portal.views import PREVIEW_MODE |
|
13 |
12 |
14 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
15 |
14 |
16 |
15 |
17 # import standard library |
16 # import standard library |
22 |
21 |
23 # import interfaces |
22 # import interfaces |
24 from pyams_form.interfaces.form import IFormContextPermissionChecker |
23 from pyams_form.interfaces.form import IFormContextPermissionChecker |
25 from pyams_portal.interfaces import IPortlet, IPortletSettings, IPortletConfiguration, IPortletPreviewer, \ |
24 from pyams_portal.interfaces import IPortlet, IPortletSettings, IPortletConfiguration, IPortletPreviewer, \ |
26 IPortletRenderer, IPortalPortletsConfiguration, IPortalTemplate, IPortalContext, IPortalPage, \ |
25 IPortletRenderer, IPortalPortletsConfiguration, IPortalTemplate, IPortalContext, IPortalPage, \ |
27 IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings, PORTLET_RENDERER_SETTINGS_KEY |
26 IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings, PORTLET_RENDERER_SETTINGS_KEY, \ |
|
27 PREVIEW_MODE |
28 from pyams_utils.interfaces import ICacheKeyValue |
28 from pyams_utils.interfaces import ICacheKeyValue |
|
29 from pyams_utils.interfaces.url import DISPLAY_CONTEXT |
29 from zope.traversing.interfaces import ITraversable |
30 from zope.traversing.interfaces import ITraversable |
30 |
31 |
31 # import packages |
32 # import packages |
32 from persistent import Persistent |
33 from persistent import Persistent |
33 from persistent.mapping import PersistentMapping |
34 from persistent.mapping import PersistentMapping |
164 return render('templates/portlet-hidden.pt', {}, request=self.request) |
165 return render('templates/portlet-hidden.pt', {}, request=self.request) |
165 else: |
166 else: |
166 return super(PortletPreviewer, self).render() |
167 return super(PortletPreviewer, self).render() |
167 |
168 |
168 |
169 |
169 PORTLETS_CACHE_KEY = 'portlet::{portlet}::{context}' |
|
170 PORTLETS_CACHE_REGION = 'portlets' |
170 PORTLETS_CACHE_REGION = 'portlets' |
171 PORTLETS_CACHE_NAME = 'PyAMS::portlet' |
171 PORTLETS_CACHE_NAME = 'PyAMS::portlet' |
|
172 |
|
173 PORTLETS_CACHE_KEY = 'portlet::{portlet}::{context}' |
|
174 PORTLETS_CACHE_DISPLAY_CONTEXT_KEY = 'portlet::{portlet}::{context}::{display}' |
172 |
175 |
173 |
176 |
174 @implementer(IPortletRenderer) |
177 @implementer(IPortletRenderer) |
175 class PortletRenderer(PortletContentProvider): |
178 class PortletRenderer(PortletContentProvider): |
176 """Portlet renderer adapter""" |
179 """Portlet renderer adapter""" |
196 def renderer_settings(self): |
200 def renderer_settings(self): |
197 return IPortletRendererSettings(self.settings) |
201 return IPortletRendererSettings(self.settings) |
198 |
202 |
199 def render(self): |
203 def render(self): |
200 preview_mode = self.request.annotations.get(PREVIEW_MODE, False) |
204 preview_mode = self.request.annotations.get(PREVIEW_MODE, False) |
201 if preview_mode: |
205 if preview_mode or not self.use_portlets_cache: |
202 return super(PortletRenderer, self).render() |
206 return super(PortletRenderer, self).render() |
203 else: |
207 else: |
204 portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME) |
208 portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME) |
205 cache_key = PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings), |
209 # check for display context |
206 context=ICacheKeyValue(self.context)) |
210 display_context = self.request.annotations.get(DISPLAY_CONTEXT) |
|
211 if display_context is None: |
|
212 cache_key = PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings), |
|
213 context=ICacheKeyValue(self.context)) |
|
214 else: |
|
215 cache_key = PORTLETS_CACHE_DISPLAY_CONTEXT_KEY.format(portlet=ICacheKeyValue(self.settings), |
|
216 context=ICacheKeyValue(self.context), |
|
217 display=ICacheKeyValue(display_context)) |
|
218 # load rendered content from cache, or create output and store it in cache |
207 try: |
219 try: |
208 result = portlets_cache.get_value(cache_key) |
220 result = portlets_cache.get_value(cache_key) |
209 logger.debug("Retrieving portlet content for cache key {0}".format(cache_key)) |
221 logger.debug("Retrieving portlet content for cache key {0}".format(cache_key)) |
210 except KeyError: |
222 except KeyError: |
211 self.update() |
223 self.update() |