diff -r 1cee610aecce -r 3bca72c8574d src/pyams_portal/portlet.py --- 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))