root/qPloneSkinDump/trunk/skin_template/utilsPortlets.py

Revision 1113 (checked in by mylan, 9 months ago)

Merged trunk with branches/plone_3.0 version

  • Property svn:eol-style set to native
Line 
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
Note: See TracBrowser for help on using the browser.