12 |
12 |
13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
15 |
15 |
16 # import standard library |
16 # import standard library |
|
17 from itertools import islice |
17 |
18 |
18 # import interfaces |
19 # import interfaces |
19 from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings |
20 from pyams_content.shared.view.interfaces import IViewsMerger |
|
21 from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings, VIEW_DISPLAY_CONTEXT |
20 from pyams_utils.interfaces import VIEW_PERMISSION |
22 from pyams_utils.interfaces import VIEW_PERMISSION |
|
23 from pyams_utils.interfaces.url import DISPLAY_CONTEXT |
21 |
24 |
22 # import packages |
25 # import packages |
23 from pyams_content.workflow import PUBLISHED_STATES |
26 from pyams_content.workflow import PUBLISHED_STATES |
24 from pyams_portal.portlet import PortletSettings, portlet_config, Portlet |
27 from pyams_portal.portlet import PortletSettings, portlet_config, Portlet |
25 from pyams_sequence.utility import get_sequence_target |
28 from pyams_sequence.utility import get_sequence_target |
26 from pyams_utils.factory import factory_config |
29 from pyams_utils.factory import factory_config |
|
30 from pyams_utils.list import unique_iter |
|
31 from pyams_utils.request import check_request |
27 from zope.interface import implementer |
32 from zope.interface import implementer |
28 from zope.schema.fieldproperty import FieldProperty |
33 from zope.schema.fieldproperty import FieldProperty |
29 |
34 |
30 from pyams_content import _ |
35 from pyams_content import _ |
31 |
36 |
36 @implementer(IViewItemsPortletSettings) |
41 @implementer(IViewItemsPortletSettings) |
37 @factory_config(provided=IViewItemsPortletSettings) |
42 @factory_config(provided=IViewItemsPortletSettings) |
38 class ViewItemsPortletSettings(PortletSettings): |
43 class ViewItemsPortletSettings(PortletSettings): |
39 """View items portlet settings""" |
44 """View items portlet settings""" |
40 |
45 |
41 view = FieldProperty(IViewItemsPortletSettings['view']) |
46 views = FieldProperty(IViewItemsPortletSettings['views']) |
|
47 views_context = FieldProperty(IViewItemsPortletSettings['views_context']) |
|
48 views_merge_mode = FieldProperty(IViewItemsPortletSettings['views_merge_mode']) |
|
49 limit = FieldProperty(IViewItemsPortletSettings['limit']) |
42 |
50 |
43 def get_view(self): |
51 def get_merger(self, request=None): |
44 if self.view is not None: |
52 if request is None: |
45 return get_sequence_target(self.view, state=PUBLISHED_STATES) |
53 request = check_request() |
|
54 return request.registry.queryUtility(IViewsMerger, name=self.views_merge_mode) |
46 |
55 |
47 def get_items(self, context): |
56 def get_views(self): |
48 view = self.get_view() |
57 for oid in self.views or (): |
49 if view is not None: |
58 view = get_sequence_target(oid, state=PUBLISHED_STATES) |
50 return view.get_results(context) |
59 if view is not None: |
|
60 yield view |
|
61 |
|
62 def get_items(self, request=None): |
|
63 if request is None: |
|
64 request = check_request() |
|
65 if self.views_context == VIEW_DISPLAY_CONTEXT: |
|
66 context = request.annotations.get(DISPLAY_CONTEXT, request.root) |
|
67 else: |
|
68 context = request.context |
|
69 if len(self.views or ()) < 2: # single view |
|
70 for view in self.get_views(): |
|
71 if view is not None: |
|
72 yield from islice(view.get_results(context), self.limit) |
|
73 else: # several views merged together |
|
74 merger = self.get_merger(request) |
|
75 if merger is not None: |
|
76 yield from islice(unique_iter(merger.get_results(self.get_views(), context)), self.limit) |
51 |
77 |
52 |
78 |
53 @portlet_config(permission=VIEW_PERMISSION) |
79 @portlet_config(permission=VIEW_PERMISSION) |
54 class ViewItemsPortlet(Portlet): |
80 class ViewItemsPortlet(Portlet): |
55 """View items portlet""" |
81 """View items portlet""" |