src/pyams_portal/portlet.py
changeset 110 0560f0ceb80f
parent 107 563e611a329f
child 112 cba761272ab8
equal deleted inserted replaced
109:1204c6c35575 110:0560f0ceb80f
    17 import logging
    17 import logging
    18 logger = logging.getLogger('PyAMS (portal)')
    18 logger = logging.getLogger('PyAMS (portal)')
    19 
    19 
    20 import venusian
    20 import venusian
    21 
    21 
       
    22 from inspect import isclass
       
    23 
    22 # import interfaces
    24 # import interfaces
    23 from pyams_form.interfaces.form import IFormContextPermissionChecker
    25 from pyams_form.interfaces.form import IFormContextPermissionChecker
    24 from pyams_portal.interfaces import IPortlet, IPortletSettings, IPortletConfiguration, IPortletPreviewer, \
    26 from pyams_portal.interfaces import IPortlet, IPortletSettings, IPortletConfiguration, IPortletPreviewer, \
    25     IPortletRenderer, IPortalPortletsConfiguration, IPortalTemplate, IPortalContext, IPortalPage, \
    27     IPortletRenderer, IPortalPortletsConfiguration, IPortalTemplate, IPortalContext, IPortalPage, \
    26     IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings
    28     IPortalTemplateConfiguration, MANAGE_TEMPLATE_PERMISSION, IPortletRendererSettings
    28 
    30 
    29 # import packages
    31 # import packages
    30 from persistent import Persistent
    32 from persistent import Persistent
    31 from persistent.mapping import PersistentMapping
    33 from persistent.mapping import PersistentMapping
    32 from pyams_utils.adapter import adapter_config, ContextAdapter, get_adapter_weight, get_annotation_adapter
    34 from pyams_utils.adapter import adapter_config, ContextAdapter, get_adapter_weight, get_annotation_adapter
       
    35 from pyams_utils.factory import get_object_factory
    33 from pyams_utils.request import check_request
    36 from pyams_utils.request import check_request
    34 from pyams_utils.vocabulary import vocabulary_config
    37 from pyams_utils.vocabulary import vocabulary_config
    35 from pyams_viewlet.viewlet import ViewContentProvider
    38 from pyams_viewlet.viewlet import ViewContentProvider
    36 from pyramid.exceptions import ConfigurationError
    39 from pyramid.exceptions import ConfigurationError
    37 from pyramid.renderers import render
    40 from pyramid.renderers import render
    38 from pyramid.threadlocal import get_current_registry
    41 from pyramid.threadlocal import get_current_registry
    39 from zope.container.contained import Contained
    42 from zope.container.contained import Contained
    40 from zope.copy import clone
    43 from zope.copy import clone
    41 from zope.interface import implementer, alsoProvides, noLongerProvides
    44 from zope.interface import implementer, alsoProvides, noLongerProvides, Interface
    42 from zope.lifecycleevent import ObjectCreatedEvent
    45 from zope.lifecycleevent import ObjectCreatedEvent
    43 from zope.location import locate
    46 from zope.location import locate
    44 from zope.schema.fieldproperty import FieldProperty
    47 from zope.schema.fieldproperty import FieldProperty
    45 from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
    48 from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
    46 
    49 
    56     permission = FieldProperty(IPortlet['permission'])
    59     permission = FieldProperty(IPortlet['permission'])
    57 
    60 
    58     toolbar_image = None
    61     toolbar_image = None
    59     toolbar_css_class = 'fa fa-fw fa-2x fa-edit'
    62     toolbar_css_class = 'fa fa-fw fa-2x fa-edit'
    60 
    63 
    61     settings_class = None
    64     settings_factory = None
    62 
    65 
    63 
    66 
    64 class portlet_config(object):
    67 class portlet_config(object):
    65     """Class decorator used to declare a portlet"""
    68     """Class decorator used to declare a portlet"""
    66 
    69 
   204 class PortletSettings(Persistent, Contained):
   207 class PortletSettings(Persistent, Contained):
   205     """Portlet settings persistent class
   208     """Portlet settings persistent class
   206 
   209 
   207     This class is supposed to be sub-classed by all custom portlet subclasses to
   210     This class is supposed to be sub-classed by all custom portlet subclasses to
   208     store their configuration settings.
   211     store their configuration settings.
   209     Each portlet sub-class must define it's settings class in it's "settings_class" attribute.
   212 
       
   213     Each portlet sub-class must define it's settings factory in it's "settings_factory" attribute.
       
   214     Given factory can be a function, a class or an interface; in this last case, implementation
       
   215     is looking for default object factory registered for this interface.
   210     """
   216     """
   211 
   217 
   212     _renderer = FieldProperty(IPortletSettings['renderer'])
   218     _renderer = FieldProperty(IPortletSettings['renderer'])
   213 
   219 
   214     __name__ = '++settings++'
   220     __name__ = '++settings++'
   276     _inherit_parent = FieldProperty(IPortletConfiguration['inherit_parent'])
   282     _inherit_parent = FieldProperty(IPortletConfiguration['inherit_parent'])
   277     _settings = FieldProperty(IPortletConfiguration['settings'])
   283     _settings = FieldProperty(IPortletConfiguration['settings'])
   278 
   284 
   279     def __init__(self, portlet):
   285     def __init__(self, portlet):
   280         self.portlet_name = portlet.name
   286         self.portlet_name = portlet.name
   281         self._settings = portlet.settings_class(self)
   287         factory = portlet.settings_factory
       
   288         if isclass(factory) and issubclass(factory, Interface):
       
   289             factory = get_object_factory(factory)
       
   290         assert factory is not None, "Missing portlet settings factory"
       
   291         self._settings = factory(self)
   282 
   292 
   283     @property
   293     @property
   284     def can_inherit(self):
   294     def can_inherit(self):
   285         return not IPortalTemplate.providedBy(self.__parent__)
   295         return not IPortalTemplate.providedBy(self.__parent__)
   286 
   296