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 |
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 |