--- a/src/pyams_portal/portlet.py Thu Jun 21 16:38:12 2018 +0200
+++ b/src/pyams_portal/portlet.py Fri Jun 22 13:00:07 2018 +0200
@@ -9,7 +9,6 @@
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
-from pyams_portal.views import PREVIEW_MODE
__docformat__ = 'restructuredtext'
@@ -24,8 +23,10 @@
from pyams_form.interfaces.form import IFormContextPermissionChecker
from pyams_portal.interfaces import IPortlet, IPortletSettings, IPortletConfiguration, IPortletPreviewer, \
IPortletRenderer, IPortalPortletsConfiguration, IPortalTemplate, IPortalContext, IPortalPage, \
- IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings, PORTLET_RENDERER_SETTINGS_KEY
+ IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings, PORTLET_RENDERER_SETTINGS_KEY, \
+ PREVIEW_MODE
from pyams_utils.interfaces import ICacheKeyValue
+from pyams_utils.interfaces.url import DISPLAY_CONTEXT
from zope.traversing.interfaces import ITraversable
# import packages
@@ -166,10 +167,12 @@
return super(PortletPreviewer, self).render()
-PORTLETS_CACHE_KEY = 'portlet::{portlet}::{context}'
PORTLETS_CACHE_REGION = 'portlets'
PORTLETS_CACHE_NAME = 'PyAMS::portlet'
+PORTLETS_CACHE_KEY = 'portlet::{portlet}::{context}'
+PORTLETS_CACHE_DISPLAY_CONTEXT_KEY = 'portlet::{portlet}::{context}::{display}'
+
@implementer(IPortletRenderer)
class PortletRenderer(PortletContentProvider):
@@ -182,6 +185,7 @@
return PORTLET_RENDERER_SETTINGS_KEY.format(self.settings.renderer)
target_interface = None
+ use_portlets_cache = True
weight = 0
@@ -198,12 +202,20 @@
def render(self):
preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
- if preview_mode:
+ if preview_mode or not self.use_portlets_cache:
return super(PortletRenderer, self).render()
else:
portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
- cache_key = PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings),
- context=ICacheKeyValue(self.context))
+ # check for display context
+ display_context = self.request.annotations.get(DISPLAY_CONTEXT)
+ if display_context is None:
+ cache_key = PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings),
+ context=ICacheKeyValue(self.context))
+ else:
+ cache_key = PORTLETS_CACHE_DISPLAY_CONTEXT_KEY.format(portlet=ICacheKeyValue(self.settings),
+ context=ICacheKeyValue(self.context),
+ display=ICacheKeyValue(display_context))
+ # load rendered content from cache, or create output and store it in cache
try:
result = portlets_cache.get_value(cache_key)
logger.debug("Retrieving portlet content for cache key {0}".format(cache_key))