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 |