src/pyams_content/features/footer/skin/__init__.py
branchdev-dc
changeset 1086 3d259e1718ef
parent 1079 a5e56749ca3d
parent 1084 6b6a884fa28a
child 1087 978a2b9123b9
equal deleted inserted replaced
1079:a5e56749ca3d 1086:3d259e1718ef
     1 #
       
     2 # Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     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
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 import logging
       
    18 logger = logging.getLogger('PyAMS (content)')
       
    19 
       
    20 # import interfaces
       
    21 from pyams_content.features.footer.interfaces import IFooterTarget, IFooterRenderer, IFooterSettings
       
    22 from pyams_content.features.renderer.interfaces import HIDDEN_RENDERER_NAME
       
    23 from pyams_portal.interfaces import PREVIEW_MODE
       
    24 from pyams_skin.layer import IPyAMSLayer
       
    25 from pyams_utils.interfaces import ICacheKeyValue
       
    26 from pyams_utils.interfaces.url import DISPLAY_CONTEXT
       
    27 
       
    28 # import packages
       
    29 from pyams_cache.beaker import get_cache
       
    30 from pyams_content.features.renderer.skin import BaseContentRenderer
       
    31 from pyams_portal.portlet import PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME, PORTLETS_CACHE_KEY
       
    32 from pyams_utils.adapter import adapter_config
       
    33 from pyams_utils.traversing import get_parent
       
    34 from pyramid.decorator import reify
       
    35 from zope.interface import implementer
       
    36 
       
    37 from pyams_content import _
       
    38 
       
    39 
       
    40 @implementer(IFooterRenderer)
       
    41 class BaseFooterRenderer(BaseContentRenderer):
       
    42     """Base footer renderer"""
       
    43 
       
    44     name = None
       
    45     settings_key = None
       
    46 
       
    47     @reify
       
    48     def settings_target(self):
       
    49         context = self.request.annotations.get(DISPLAY_CONTEXT)
       
    50         if context is None:
       
    51             context = self.context
       
    52         return get_parent(context, IFooterTarget)
       
    53 
       
    54     @reify
       
    55     def settings(self):
       
    56         if self.settings_interface is None:
       
    57             return None
       
    58         target = self.settings_target
       
    59         settings = IFooterSettings(target)
       
    60         while settings.inherit:
       
    61             settings = IFooterSettings(settings.parent)
       
    62         return settings.settings
       
    63 
       
    64     @reify
       
    65     def cache_key(self):
       
    66         return PORTLETS_CACHE_KEY.format(portlet=self.name,
       
    67                                          context=ICacheKeyValue(self.settings_target),
       
    68                                          lang=self.request.locale_name)
       
    69 
       
    70     def render(self):
       
    71         preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
       
    72         if preview_mode:
       
    73             return super(BaseFooterRenderer, self).render()
       
    74         else:
       
    75             portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
       
    76             cache_key = self.cache_key
       
    77             if self.context is not self.request.context:  # display shared content
       
    78                 cache_key = '{0}::shared'.format(cache_key)
       
    79             try:
       
    80                 result = portlets_cache.get_value(cache_key)
       
    81                 logger.debug("Retrieving footer content from cache key {0}".format(cache_key))
       
    82             except KeyError:
       
    83                 result = super(BaseFooterRenderer, self).render()
       
    84                 portlets_cache.set_value(cache_key, result)
       
    85                 logger.debug("Storing footer content to cache key {0}".format(cache_key))
       
    86             return result
       
    87 
       
    88 
       
    89 @adapter_config(name=HIDDEN_RENDERER_NAME, context=(IFooterTarget, IPyAMSLayer), provides=IFooterRenderer)
       
    90 class HiddenFooterRenderer(BaseFooterRenderer):
       
    91     """Hidden footer renderer"""
       
    92 
       
    93     name = HIDDEN_RENDERER_NAME
       
    94     label = _("Hidden footer")
       
    95     weight = -999
       
    96 
       
    97     def render(self):
       
    98         return ''