1 | from zope.interface import providedBy |
---|
2 | from zope.schema import getFields |
---|
3 | from zope.component import getMultiAdapter, getUtility, getSiteManager |
---|
4 | |
---|
5 | from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, IPlacelessPortletManager |
---|
6 | from plone.portlets.interfaces import IPortletContext, IPortletDataProvider |
---|
7 | from plone.portlets.interfaces import ILocalPortletAssignmentManager |
---|
8 | |
---|
9 | from Products.CMFCore.utils import getToolByName |
---|
10 | from Products.GenericSetup.utils import _getDottedName, _resolveDottedName |
---|
11 | |
---|
12 | |
---|
13 | def extractInfoFromAssignment(name, assignment): |
---|
14 | klass = assignment.__class__ |
---|
15 | a = {'name' : name, 'class' : '%s' % _getDottedName(klass)} |
---|
16 | data = assignment.data |
---|
17 | kwargs = {} |
---|
18 | for i in list(providedBy(data)): |
---|
19 | if i.isOrExtends(IPortletDataProvider): |
---|
20 | for field_name, field in getFields(i).items(): |
---|
21 | kwargs[field_name] = field.get(assignment) |
---|
22 | a['kwargs'] = kwargs |
---|
23 | return a |
---|
24 | |
---|
25 | def extractSiteWidePortlets(context, managers): |
---|
26 | """ Extract site-wide portlets |
---|
27 | Data structure: |
---|
28 | '__site-wide-portlets__', [(<manager1_name>, <manager1_info>), |
---|
29 | (<manager2_name>, <manager2_info>), |
---|
30 | (<manager3_name>, <manager3_info>)]) |
---|
31 | <manager_info>: |
---|
32 | {'category1' : <catmapping1>, |
---|
33 | 'category2' : <catmapping2>} |
---|
34 | <catmapping>: |
---|
35 | {'key1' : <mapping1>, |
---|
36 | 'key2' : <mapping2>} |
---|
37 | <mapping>: |
---|
38 | {'assignment_name1' : <assignment1>, |
---|
39 | 'assignment_name2' : <assignment2>} |
---|
40 | <assignment>: |
---|
41 | {'name' : 'Assignment', |
---|
42 | 'class' : 'dotted.path.to.assignment.class', |
---|
43 | 'kwargs' : {'parameter1' : 'value1', |
---|
44 | 'parameter2' : 'value2'} |
---|
45 | """ |
---|
46 | info = [] |
---|
47 | for manager_name, manager in managers: |
---|
48 | manager_info = {} |
---|
49 | for category, catmapping in manager.items(): |
---|
50 | catmapping_info = {} |
---|
51 | for key, mapping in catmapping.items(): |
---|
52 | mapping_info = {} |
---|
53 | for name, assignment in mapping.items(): |
---|
54 | mapping_info[name] = extractInfoFromAssignment(name, assignment) |
---|
55 | catmapping_info[key] = mapping_info |
---|
56 | manager_info[category] = catmapping_info |
---|
57 | info.append((manager_name, manager_info)) |
---|
58 | return info |
---|
59 | |
---|
60 | def extractContextPortletsFromManager(context, manager): |
---|
61 | """ Extract all contextual portlets from given object and portlet manager, and portlets blacklists |
---|
62 | Data structure: |
---|
63 | <manager_info> = |
---|
64 | {'blacklists' : [(GROUP_CATEGORY, True), |
---|
65 | (CONTENT_TYPE_CATEGORY, False), |
---|
66 | (CONTEXT_CATEGORY, None)], |
---|
67 | 'assignments' : [{'name' : 'Assignment-2', |
---|
68 | 'class' : 'dotted.path.to.assignment.class', |
---|
69 | 'kwargs' : {'parameter1' : 'value1', |
---|
70 | 'parameter2' : 'value2'}}, |
---|
71 | {'name' : 'Assignment', |
---|
72 | 'class' : 'dotted.path.to.assignment.class', |
---|
73 | 'kwargs' : {'parameter1' : 'value1', |
---|
74 | 'parameter2' : 'value2'}]} |
---|
75 | """ |
---|
76 | |
---|
77 | info = {} |
---|
78 | info['assignments'] = assignments = [] |
---|
79 | info['blacklists'] = blacklists = [] |
---|
80 | |
---|
81 | # Extract contextual portlets |
---|
82 | mapping = getMultiAdapter((context, manager), IPortletAssignmentMapping, context=context) |
---|
83 | for name, assignment in mapping.items(): |
---|
84 | assignments.append(extractInfoFromAssignment(name, assignment)) |
---|
85 | |
---|
86 | # Extract blacklists for given object and manager |
---|
87 | localassignmentmanager = getMultiAdapter((context, manager), ILocalPortletAssignmentManager) |
---|
88 | blacklist = localassignmentmanager._getBlacklist() |
---|
89 | if blacklist is not None: |
---|
90 | for category, key in blacklist.items(): |
---|
91 | blacklists.append((category, key)) |
---|
92 | |
---|
93 | return info |
---|
94 | |
---|
95 | def extractPortletsFromContext(context, slot_structure, typesToShow, managers): |
---|
96 | """ Extract portlets for given object assigned through all portlet managers. |
---|
97 | Data structure: |
---|
98 | ('unique/path/to/context', [(<manager1_name>, <manager1_info>), |
---|
99 | (<manager2_name>, <manager2_info>), |
---|
100 | (<manager3_name>, <manager3_info>)]) |
---|
101 | """ |
---|
102 | |
---|
103 | |
---|
104 | info = [] |
---|
105 | key = '/'.join(context.getPhysicalPath()[2:]) |
---|
106 | |
---|
107 | for name, manager in managers: |
---|
108 | info.append((name, extractContextPortletsFromManager(context, manager))) |
---|
109 | |
---|
110 | slot_structure.append((key, info)) |
---|
111 | |
---|
112 | return slot_structure |
---|
113 | |
---|
114 | def dumpAllPortlets(context, slot_structure, typesToShow, managers): |
---|
115 | extractPortletsFromContext(context, slot_structure, typesToShow, managers) |
---|
116 | if getattr(context.aq_base, 'isPrincipiaFolderish', 0): |
---|
117 | for id, obj in context.contentItems(): |
---|
118 | if obj.portal_type in typesToShow: |
---|
119 | dumpAllPortlets(obj, slot_structure, typesToShow, managers) |
---|
120 | |
---|
121 | return slot_structure |
---|
122 | |
---|
123 | def dumpPortlets(context, dump_policy, dump_portlets_selection): |
---|
124 | """ Extract portlets from given set of objects and site-wide portlets too. |
---|
125 | Data structure: |
---|
126 | SLOT_STRUCTURE = |
---|
127 | [(), (), ()] |
---|
128 | """ |
---|
129 | |
---|
130 | portal = getToolByName(context, 'portal_url').getPortalObject() |
---|
131 | portal_state = getMultiAdapter((portal, context.REQUEST), name=u'plone_portal_state') |
---|
132 | typesToShow = portal_state.friendly_types() |
---|
133 | |
---|
134 | components = getSiteManager(context) |
---|
135 | managers = [r for r in components.registeredUtilities() if r.provided.isOrExtends(IPortletManager)] |
---|
136 | context_managers = [(m.name, getUtility(IPortletManager, name=m.name, context=context)) for m in managers |
---|
137 | if not IPlacelessPortletManager.providedBy(m.component)] |
---|
138 | managers = [(m.name, getUtility(IPortletManager, name=m.name, context=context)) for m in managers] |
---|
139 | |
---|
140 | slot_structure = [] |
---|
141 | if dump_policy == 'root': |
---|
142 | extractPortletsFromContext(portal, slot_structure, typesToShow, context_managers) |
---|
143 | elif dump_policy == 'all': |
---|
144 | dumpAllPortlets(portal, slot_structure, typesToShow, context_managers) |
---|
145 | elif dump_policy == 'selection': |
---|
146 | for ppath in dump_portlets_selection: |
---|
147 | obj = portal.restrictedTraverse(ppath) |
---|
148 | extractPortletsFromContext(obj, slot_structure, typesToShow, context_managers) |
---|
149 | |
---|
150 | slot_structure.append(('__site-wide-portlets__', extractSiteWidePortlets(portal, managers))) |
---|
151 | |
---|
152 | return slot_structure |
---|
153 | |
---|