[74] | 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 | |
---|