src/pyams_portal/portlet.py
changeset 293 e606ea8100d5
parent 275 36ff0ccd4253
child 296 6984ee473437
equal deleted inserted replaced
292:dacbe2096da4 293:e606ea8100d5
   140         super(PortletContentProvider, self).__init__(context, request, view)
   140         super(PortletContentProvider, self).__init__(context, request, view)
   141         self.portlet = request.registry.queryUtility(IPortlet,
   141         self.portlet = request.registry.queryUtility(IPortlet,
   142                                                      name=settings.configuration.portlet_name)
   142                                                      name=settings.configuration.portlet_name)
   143         self.settings = settings
   143         self.settings = settings
   144 
   144 
   145     def render(self):
   145     def render(self, template_name=''):
   146         if self.portlet is None:
   146         if self.portlet is None:
   147             return ''
   147             return ''
   148         if self.portlet.permission and not self.request.has_permission(self.portlet.permission):
   148         if self.portlet.permission and not self.request.has_permission(self.portlet.permission):
   149             return ''
   149             return ''
   150         return super(PortletContentProvider, self).render()
   150         return super().render(template_name)
   151 
   151 
   152 
   152 
   153 PREVIEW_PREFIX = '''<div class="padding-x-5 text-info">
   153 PREVIEW_PREFIX = '''<div class="padding-x-5 text-info">
   154     <span>{label}</span>
   154     <span>{label}</span>
   155     {renderer}
   155     {renderer}
   168             template = IPortalPage(self.context).template
   168             template = IPortalPage(self.context).template
   169         config = IPortalTemplateConfiguration(template)
   169         config = IPortalTemplateConfiguration(template)
   170         slot_id, slot_name = config.get_portlet_slot(self.settings.configuration.portlet_id)
   170         slot_id, slot_name = config.get_portlet_slot(self.settings.configuration.portlet_id)
   171         return config.get_slot_configuration(slot_name)
   171         return config.get_slot_configuration(slot_name)
   172 
   172 
   173     def render(self):
   173     def render(self, template_name=''):
   174         if self.settings.renderer == 'hidden':
   174         if self.settings.renderer == 'hidden':
   175             return render('templates/portlet-hidden.pt', {}, request=self.request)
   175             return render('templates/portlet-hidden.pt', {}, request=self.request)
   176         else:
   176         result = super(PortletPreviewer, self).render()
   177             result = super(PortletPreviewer, self).render()
   177         renderer = self.settings.get_renderer()
   178             renderer = self.settings.get_renderer()
   178         translate = self.request.localizer.translate
   179             translate = self.request.localizer.translate
   179         result = PREVIEW_PREFIX.format(label=translate(_("Renderer:")),
   180             result = PREVIEW_PREFIX.format(label=translate(_("Renderer:")),
   180                                        renderer=translate(renderer.label)) + result
   181                                            renderer=translate(renderer.label)) + result
   181         return result
   182             return result
       
   183 
   182 
   184 
   183 
   185 PORTLETS_CACHE_REGION = 'portlets'
   184 PORTLETS_CACHE_REGION = 'portlets'
   186 PORTLETS_CACHE_NAME = 'PyAMS::portlet'
   185 PORTLETS_CACHE_NAME = 'PyAMS::portlet'
   187 
   186 
   224         if display_context is None:
   223         if display_context is None:
   225             return PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings),
   224             return PORTLETS_CACHE_KEY.format(portlet=ICacheKeyValue(self.settings),
   226                                              hostname=self.request.host,
   225                                              hostname=self.request.host,
   227                                              context=ICacheKeyValue(self.context),
   226                                              context=ICacheKeyValue(self.context),
   228                                              lang=self.request.locale_name)
   227                                              lang=self.request.locale_name)
   229         else:
   228         return PORTLETS_CACHE_DISPLAY_CONTEXT_KEY.format(portlet=ICacheKeyValue(self.settings),
   230             return PORTLETS_CACHE_DISPLAY_CONTEXT_KEY.format(portlet=ICacheKeyValue(self.settings),
   229                                                          hostname=self.request.host,
   231                                                              hostname=self.request.host,
   230                                                          context=ICacheKeyValue(self.context),
   232                                                              context=ICacheKeyValue(self.context),
   231                                                          display=ICacheKeyValue(
   233                                                              display=ICacheKeyValue(
   232                                                              display_context),
   234                                                                  display_context),
   233                                                          lang=self.request.locale_name)
   235                                                              lang=self.request.locale_name)
   234 
   236 
   235     def render(self, template_name=''):
   237     def render(self):
       
   238         preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
   236         preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
   239         if preview_mode or not self.use_portlets_cache:
   237         if preview_mode or not self.use_portlets_cache:
   240             return super(PortletRenderer, self).render()
   238             return super().render(template_name)
   241         else:
   239         portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
   242             portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
   240         cache_key = self.get_cache_key()
   243             cache_key = self.get_cache_key()
   241         if template_name:
   244             if self.use_authentication:
   242             cache_key = '{}::{}'.format(cache_key, template_name)
   245                 cache_key = '{0}::{1}'.format(cache_key, self.request.principal.id)
   243         if self.use_authentication:
   246             # load rendered content from cache, or create output and store it in cache
   244             cache_key = '{}::{}'.format(cache_key, self.request.principal.id)
   247             try:
   245         # load rendered content from cache, or create output and store it in cache
   248                 result = portlets_cache.get_value(cache_key)
   246         try:
   249                 logger.debug("Retrieving portlet content from cache key {0}".format(cache_key))
   247             result = portlets_cache.get_value(cache_key)
   250             except KeyError:
   248             logger.debug("Retrieving portlet content from cache key {0}".format(cache_key))
   251                 self.update()
   249         except KeyError:
   252                 result = super(PortletRenderer, self).render()
   250             self.update()
   253                 portlets_cache.set_value(cache_key, result)
   251             result = super().render(template_name)
   254                 logger.debug("Storing portlet content to cache key {0}".format(cache_key))
   252             portlets_cache.set_value(cache_key, result)
   255             return result
   253             logger.debug("Storing portlet content to cache key {0}".format(cache_key))
       
   254         return result
   256 
   255 
   257 
   256 
   258 @vocabulary_config(name='PyAMS portlet renderers')
   257 @vocabulary_config(name='PyAMS portlet renderers')
   259 class PortletRenderersVocabulary(SimpleVocabulary):
   258 class PortletRenderersVocabulary(SimpleVocabulary):
   260     """Portlet renderers vocabulary"""
   259     """Portlet renderers vocabulary"""
   261 
   260 
   262     def __init__(self, context):
   261     def __init__(self, context):
   263         request = check_request()
   262         request = check_request()
   264         translate = request.localizer.translate
   263         translate = request.localizer.translate
   265         terms = [SimpleTerm(name, title=translate(adapter.label))
   264         terms = [
   266                  for name, adapter in sorted(request.registry.getAdapters((request.root, request,
   265             SimpleTerm(name, title=translate(adapter.label))
       
   266             for name, adapter in sorted(request.registry.getAdapters((request.root, request,
   267                                                                            request, context),
   267                                                                            request, context),
   268                                                                           IPortletRenderer),
   268                                                                           IPortletRenderer),
   269                                              key=get_adapter_weight)]
   269                                         key=get_adapter_weight)
       
   270         ]
   270         super(PortletRenderersVocabulary, self).__init__(terms)
   271         super(PortletRenderersVocabulary, self).__init__(terms)
   271 
   272 
   272 
   273 
   273 #
   274 #
   274 # Portlet configuration
   275 # Portlet configuration