src/pyams_portal/portlet.py
changeset 135 3bca72c8574d
parent 133 7ad82c70e528
child 138 b671ae6b0e88
equal deleted inserted replaced
134:1cee610aecce 135:3bca72c8574d
     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"""
   180     @property
   183     @property
   181     def settings_key(self):
   184     def settings_key(self):
   182         return PORTLET_RENDERER_SETTINGS_KEY.format(self.settings.renderer)
   185         return PORTLET_RENDERER_SETTINGS_KEY.format(self.settings.renderer)
   183 
   186 
   184     target_interface = None
   187     target_interface = None
       
   188     use_portlets_cache = True
   185 
   189 
   186     weight = 0
   190     weight = 0
   187 
   191 
   188     @property
   192     @property
   189     def slot_configuration(self):
   193     def slot_configuration(self):
   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()