src/pyams_portal/portlet.py
changeset 102 b3460ef91e43
parent 95 b4e5117061d3
child 107 563e611a329f
equal deleted inserted replaced
101:7cc130cba13c 102:b3460ef91e43
    27 from zope.traversing.interfaces import ITraversable
    27 from zope.traversing.interfaces import ITraversable
    28 
    28 
    29 # import packages
    29 # import packages
    30 from persistent import Persistent
    30 from persistent import Persistent
    31 from persistent.mapping import PersistentMapping
    31 from persistent.mapping import PersistentMapping
    32 from pyams_utils.adapter import adapter_config, ContextAdapter
    32 from pyams_utils.adapter import adapter_config, ContextAdapter, get_adapter_weight
    33 from pyams_utils.request import check_request
    33 from pyams_utils.request import check_request
    34 from pyams_utils.vocabulary import vocabulary_config
    34 from pyams_utils.vocabulary import vocabulary_config
    35 from pyams_viewlet.viewlet import ViewContentProvider
    35 from pyams_viewlet.viewlet import ViewContentProvider
    36 from pyramid.exceptions import ConfigurationError
    36 from pyramid.exceptions import ConfigurationError
       
    37 from pyramid.renderers import render
    37 from pyramid.threadlocal import get_current_registry
    38 from pyramid.threadlocal import get_current_registry
    38 from zope.container.contained import Contained
    39 from zope.container.contained import Contained
    39 from zope.copy import clone
    40 from zope.copy import clone
    40 from zope.interface import implementer, alsoProvides, noLongerProvides
    41 from zope.interface import implementer, alsoProvides, noLongerProvides
    41 from zope.lifecycleevent import ObjectCreatedEvent
    42 from zope.lifecycleevent import ObjectCreatedEvent
   131         super(PortletContentProvider, self).__init__(context, request, view)
   132         super(PortletContentProvider, self).__init__(context, request, view)
   132         self.portlet = request.registry.queryUtility(IPortlet, name=settings.configuration.portlet_name)
   133         self.portlet = request.registry.queryUtility(IPortlet, name=settings.configuration.portlet_name)
   133         self.settings = settings
   134         self.settings = settings
   134 
   135 
   135     def __call__(self):
   136     def __call__(self):
   136         if (self.portlet is None) or not self.settings.visible:
   137         if self.portlet is None:
   137             return ''
   138             return ''
   138         if self.portlet.permission and not self.request.has_permission(self.portlet.permission):
   139         if self.portlet.permission and not self.request.has_permission(self.portlet.permission):
   139             return ''
   140             return ''
   140         self.update()
   141         self.update()
   141         return self.render()
   142         return self.render()
   153             template = IPortalPage(self.context).template
   154             template = IPortalPage(self.context).template
   154         config = IPortalTemplateConfiguration(template)
   155         config = IPortalTemplateConfiguration(template)
   155         slot_id, slot_name = config.get_portlet_slot(self.settings.configuration.portlet_id)
   156         slot_id, slot_name = config.get_portlet_slot(self.settings.configuration.portlet_id)
   156         return config.get_slot_configuration(slot_name)
   157         return config.get_slot_configuration(slot_name)
   157 
   158 
       
   159     def render(self):
       
   160         if self.settings.renderer == 'hidden':
       
   161             return render('templates/portlet-hidden.pt', {}, request=self.request)
       
   162         else:
       
   163             return super(PortletPreviewer, self).render()
       
   164 
   158 
   165 
   159 @implementer(IPortletRenderer)
   166 @implementer(IPortletRenderer)
   160 class PortletRenderer(PortletContentProvider):
   167 class PortletRenderer(PortletContentProvider):
   161     """Portlet renderer adapter"""
   168     """Portlet renderer adapter"""
   162 
   169 
   163     target_interface = None
   170     target_interface = None
       
   171     weight = 0
   164 
   172 
   165     @property
   173     @property
   166     def slot_configuration(self):
   174     def slot_configuration(self):
   167         template = IPortalPage(self.context).template
   175         template = IPortalPage(self.context).template
   168         config = IPortalTemplateConfiguration(template)
   176         config = IPortalTemplateConfiguration(template)
   176 
   184 
   177     def __init__(self, context):
   185     def __init__(self, context):
   178         request = check_request()
   186         request = check_request()
   179         translate = request.localizer.translate
   187         translate = request.localizer.translate
   180         terms = [SimpleTerm(name, title=translate(adapter.label))
   188         terms = [SimpleTerm(name, title=translate(adapter.label))
   181                  for name, adapter in request.registry.getAdapters((request.root, request, request, context),
   189                  for name, adapter in sorted(request.registry.getAdapters((request.root, request, request, context),
   182                                                                    IPortletRenderer)]
   190                                                                           IPortletRenderer),
       
   191                                              key=get_adapter_weight)]
   183         super(PortletRenderersVocabulary, self).__init__(terms)
   192         super(PortletRenderersVocabulary, self).__init__(terms)
   184 
   193 
   185 
   194 
   186 #
   195 #
   187 # Portlet configuration
   196 # Portlet configuration
   194     This class is supposed to be sub-classed by all custom portlet subclasses to
   203     This class is supposed to be sub-classed by all custom portlet subclasses to
   195     store their configuration settings.
   204     store their configuration settings.
   196     Each portlet sub-class must define it's settings class in it's "settings_class" attribute.
   205     Each portlet sub-class must define it's settings class in it's "settings_class" attribute.
   197     """
   206     """
   198 
   207 
   199     visible = FieldProperty(IPortletSettings['visible'])
       
   200     _renderer = FieldProperty(IPortletSettings['renderer'])
   208     _renderer = FieldProperty(IPortletSettings['renderer'])
   201 
   209 
   202     __name__ = '++settings++'
   210     __name__ = '++settings++'
   203 
   211 
   204     def __init__(self, configuration):
   212     def __init__(self, configuration):
   205         self.__parent__ = configuration
   213         self.__parent__ = configuration
       
   214 
       
   215     @property
       
   216     def visible(self):
       
   217         return self._renderer != 'hidden'
   206 
   218 
   207     @property
   219     @property
   208     def renderer(self):
   220     def renderer(self):
   209         return self._renderer
   221         return self._renderer
   210 
   222