src/pyams_portal/portlet.py
changeset 135 3bca72c8574d
parent 133 7ad82c70e528
child 138 b671ae6b0e88
--- 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))