source: products/qPloneSkinDump/trunk/skin_template/utilsPortlets.py @ 2111

Last change on this file since 2111 was 74, checked in by chervol, 18 years ago

initial plone2.0.5 branch import

  • Property svn:eol-style set to native
File size: 6.5 KB
RevLine 
[74]1from zope.interface import providedBy
2from zope.schema import getFields
3from zope.component import getMultiAdapter, getUtility, getSiteManager
4
5from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, IPlacelessPortletManager
6from plone.portlets.interfaces import IPortletContext, IPortletDataProvider
7from plone.portlets.interfaces import ILocalPortletAssignmentManager
8
9from Products.CMFCore.utils import getToolByName
10from Products.GenericSetup.utils import _getDottedName, _resolveDottedName
11
12
13def 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
25def 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
60def 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
95def 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
114def 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
123def 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 repository browser.