Changeset 1010
- Timestamp:
- 11/28/07 11:21:46
- Files:
-
- qPloneSkinDump/branches/plone_3.0/HISTORY.txt (modified) (1 diff)
- qPloneSkinDump/branches/plone_3.0/TODO.txt (modified) (1 diff)
- qPloneSkinDump/branches/plone_3.0/skin_template/setuphandlers.py (modified) (3 diffs)
- qPloneSkinDump/branches/plone_3.0/utils.py (modified) (3 diffs)
- qPloneSkinDump/branches/plone_3.0/version.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
qPloneSkinDump/branches/plone_3.0/HISTORY.txt
r999 r1010 1 qPloneSkinDump 0.8.1 2 3 - essential improvements of dumping portlets 4 1 5 qPloneSkinDump 0.8.0 2 6 - configlet form improvement qPloneSkinDump/branches/plone_3.0/TODO.txt
r999 r1010 1 *** Under consideration***1 *** TODO LIST *** 2 2 3 - improvement portlets dumping4 3 - improvements in resource dumping 5 4 - refactor portal_view_customizations dump 6 5 - add dump of portal_properties 7 - add dump of viewlets.xml and portlets.xml 6 - add dump of viewlets.xml 7 - add dump of portlets.xml 8 8 - core refactorization, divide into small chunks all functionality (too difficult to upgrade current skindump structure) 9 9 * maybe using zope 3 component architecture 10 10 maybe in future: 11 11 - refactor qPloneSkinDump to work with python paster package, for use ZopeSkel templates styling qPloneSkinDump/branches/plone_3.0/skin_template/setuphandlers.py
r999 r1010 1 from zope.dottedname.resolve import resolve 1 2 from zope.component import getUtility, getSiteManager, getMultiAdapter 2 3 3 from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, ILocalPortletAssignmentManager 4 from plone.app.customerize.registration import * 4 from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, IPlacelessPortletManager 5 from plone.portlets.interfaces import IPortletContext, IPortletDataProvider 6 from plone.portlets.interfaces import ILocalPortletAssignmentManager 7 from plone.portlets.storage import PortletCategoryMapping, PortletAssignmentMapping 5 8 from plone.app.portlets import portlets 6 9 10 from plone.app.customerize.registration import * 11 7 12 from Products.CMFCore.utils import getToolByName 13 from Products.GenericSetup.utils import _getDottedName, _resolveDottedName 8 14 9 15 from Products.%(product_name)s.config import * … … 14 20 logger = getLogger('%(product_name)s') 15 21 16 def assignPortlet(mapping, portlet_name, portlet_type, **kwargs): 17 portlet = None 18 if hasattr(portlets, portlet_type): 19 portlet = getattr(portlets, portlet_type).Assignment 20 if portlet: 21 portlet = portlet(**kwargs) 22 mapping[portlet_name] = portlet 23 return portlet 24 return False 22 def assignPortlet(mapping, info): 23 name = info['name'] 24 try: 25 assignment = _resolveDottedName(info['class']) 26 except: 27 e,v,tr = sys.exc_info() 28 logger.info('Debug from setup portlets handler: %%s: %%s (%%s)' , info['class'], str(v), str(e)) 29 return False 30 else: 31 portlet = assignment(**info['kwargs']) 32 if mapping.get(name, None) is not None: 33 del mapping[name] 34 mapping[name] = portlet 35 return portlet 25 36 26 def setup PortletsForContext(context, info):37 def setupSiteWidePortlets(site, data, managers): 27 38 28 leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=context) 29 rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=context) 39 for name, info in data: 40 manager = managers.get(name, None) 41 if manager is not None: 42 for category, keys in info.items(): 43 catmapping = manager.get(category, None) 44 if catmapping is None: 45 catmapping = manager[category] = PortletCategoryMapping() 46 for key, assignments in keys.items(): 47 mapping = catmapping.get(key, None) 48 if mapping is None: 49 mapping = catmapping[key] = PortletAssignmentMapping() 50 for assignment in assignments.values(): 51 assignPortlet(mapping, assignment) 30 52 31 left = getMultiAdapter((context, leftColumn,), IPortletAssignmentMapping, context=context) 32 right = getMultiAdapter((context, rightColumn,), IPortletAssignmentMapping, context=context) 53 def setupPortletsForContext(context, data, managers): 33 54 34 leftassignable = getMultiAdapter((context, leftColumn,), ILocalPortletAssignmentManager) 35 rightassignable = getMultiAdapter((context, rightColumn,), ILocalPortletAssignmentManager) 36 37 for cat, val in info.get('left_slots_blacklists', {}).items(): 38 leftassignable.setBlacklistStatus(cat, val) 39 40 for cat, val in info.get('right_slots_blacklists', {}).items(): 41 rightassignable.setBlacklistStatus(cat, val) 42 43 for slot in info.get('remove_left_slots', ()) or left.keys(): 44 if slot in left: 45 del left[slot] 46 47 for slot in info.get('remove_right_slots', ()) or right.keys(): 48 if slot in right: 49 del right[slot] 50 51 for slot in info.get('add_left_slots', ()): 52 if slot['name'] not in left: 53 assignPortlet(left, slot['name'], slot['type'], **slot['kwargs']) 54 55 for slot in info.get('add_right_slots', ()): 56 if slot['name'] not in right: 57 assignPortlet(right, slot['name'], slot['type'], **slot['kwargs']) 55 for name, info in data: 56 manager = managers.get(name, None) 57 if manager is not None: 58 if info['assignments']: 59 # set portlet assignments 60 mapping = getMultiAdapter((context, manager), IPortletAssignmentMapping, context=context) 61 for assignment in info['assignments']: 62 assignPortlet(mapping, assignment) 63 if info['blacklists']: 64 # set blacklists 65 localassignmentmanager = getMultiAdapter((context, manager), ILocalPortletAssignmentManager, context=context) 66 for category, status in info['blacklists']: 67 localassignmentmanager.setBlacklistStatus(category, status) 58 68 59 69 def importPortlets(context): 60 70 site = context.getSite() 61 71 72 components = getSiteManager(site) 73 ms = [r for r in components.registeredUtilities() if r.provided.isOrExtends(IPortletManager)] 74 context_managers = {} 75 for m in ms: 76 if not m.provided.isOrExtends(IPlacelessPortletManager): 77 context_managers[m.name] = getUtility(IPortletManager, name=m.name, context=site) 78 79 managers = {} 80 for m in ms: 81 managers[m.name] = getUtility(IPortletManager, name=m.name, context=site) 82 62 83 for path, info in SLOT_STRUCTURE: 63 try: 64 obj = site.restrictedTraverse(path) 65 except: 66 e,v,tr = sys.exc_info() 67 logger.info('Debug from importPortlets handler: %%s: %%s (%%s)' , path, str(v), str(e)) 84 if path == '__site-wide-portlets__': 85 setupSiteWidePortlets(site, info, managers) 68 86 else: 69 setupPortletsForContext(obj, info) 87 try: 88 obj = site.restrictedTraverse(path) 89 except: 90 e,v,tr = sys.exc_info() 91 logger.info('Debug from importPortlets handler: %%s: %%s (%%s)' , path, str(v), str(e)) 92 else: 93 setupPortletsForContext(obj, info, context_managers) 70 94 71 95 def importZexps(context): … … 79 103 if FINAL_CUSTOMIZATION_FUNCTIONS: 80 104 dummy = [func(site, out) for func in FINAL_CUSTOMIZATION_FUNCTIONS] 81 82 def old_install(context):83 site = context.getSite()84 self = site85 86 # Checking base condition for installation87 # skinsTool = getToolByName(self, 'portal_skins')88 # Checking for absence of SKIN_NAME skin in site89 # skin_names = skinsTool.getSkinSelections()90 # if SKIN_NAME in skin_names:91 # raise AttributeError("Installation aborted due to '%%s' skin already present in your site." %% SKIN_NAME)92 # Checking for BASE_SKIN_NAME presenting in portal93 # skin_names = skinsTool.getSkinSelections()94 # if not BASE_SKIN_NAME in skin_names:95 # raise AttributeError("Impossible installation without %%s skin." %% BASE_SKIN_NAME)96 # Checking for presenting lower_SKIN_NAME directory in portal skins97 # lower_SKIN_NAME = string.lower(SKIN_NAME)98 #if lower_SKIN_NAME in skinsTool.objectIds():99 # raise AttributeError("%%s skin layer already exist in portal skins. Installation Impossible." %% lower_SKIN_NAME)100 101 #return CHECKED_MESSAGE102 103 # AFTER INSTALL104 #out=StringIO()105 # get all needed tools and some portal's core objects106 #portal = getToolByName(self, 'portal_url').getPortalObject()107 #pp = getToolByName(portal, 'portal_properties')108 #portal_css = getToolByName(portal, 'portal_css', None)109 #portal_js = getToolByName(portal, 'portal_javascripts', None)110 # Make main prepare procedures111 #pp_up = prepareInstallation(portal, pp, out) # create 'uninstall_properties' propertySheet in portal_properties112 # Install skin113 #installSkin(portal, pp_up, out) # performed with portal_setup114 #prepareUninstallSkin(portal, pp_up, out)115 116 # Register css resources117 #if portal_css and DOES_COSTOMIZE_CSS:118 #registerResource(pp_up, portal_css, portal_css.registerStylesheet, out \119 #,CSS_LIST, SKIN_CSS_REGDATA, 'q_registered_css', CSS_REG_PROPS)120 #print >> out, "Completed tuning CSS registry for new skin needs."121 # Register js resources122 #if portal_js and DOES_COSTOMIZE_JS:123 #registerResource(pp_up, portal_js, portal_js.registerScript, out \124 #,JS_LIST, SKIN_JS_REGDATA, 'q_registered_js', JS_REG_PROPS)#---installJS---125 #print >> out, "Completed tuning JS registry for new skin needs."126 # Customize slots127 #if LEFT_SLOTS or RIGHT_SLOTS:128 #customizeSlots(portal, pp_up, out)129 # Import object(s) to portal130 #if checkIfImport():131 #res_import = performImportToPortal(portal)132 #print >> out, res_import133 # FINAL customization call additional functions from config134 #if FINAL_CUSTOMIZATION_FUNCTIONS:135 #dummy = [func(portal, out) for func in FINAL_CUSTOMIZATION_FUNCTIONS]136 print >> out, "%%s generated product." %% GENERATOR_PRODUCT137 print >> out, '=== Installation successfully completed. ==='138 #product.log(out.getvalue())139 #product._p_changed = 1 #XXX:NEED for stable writing 'out' log to qi on afterinstallation.140 return out.getvalue()141 105 142 106 def importCustomViews(context): qPloneSkinDump/branches/plone_3.0/utils.py
r1002 r1010 12 12 from zope.publisher.interfaces.browser import IBrowserRequest 13 13 from five.customerize.interfaces import IViewTemplateContainer, ITTWViewTemplate 14 from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, IP ortletDataProvider15 from plone.portlets. constants import CONTEXT_CATEGORY, GROUP_CATEGORY, CONTENT_TYPE_CATEGORY14 from plone.portlets.interfaces import IPortletAssignmentMapping, IPortletManager, IPlacelessPortletManager 15 from plone.portlets.interfaces import IPortletContext, IPortletDataProvider 16 16 from plone.portlets.interfaces import ILocalPortletAssignmentManager 17 17 from plone.app.customerize.registration import generateIdFromRegistration, interfaceName 18 18 19 from Products.GenericSetup.utils import _getDottedName, _resolveDottedName 19 20 from Products.GenericSetup.interfaces import IBody 20 21 from Products.GenericSetup.context import BaseContext … … 74 75 return result 75 76 76 def extractPortletsFromContext(context, slot_structure, typesToShow): 77 def extractInfoFromAssignment(name, assignment): 78 klass = assignment.__class__ 79 a = {'name' : name, 'class' : '%s' % _getDottedName(klass)} 80 data = assignment.data 81 kwargs = {} 82 for i in list(providedBy(data)): 83 if i.isOrExtends(IPortletDataProvider): 84 for field_name, field in getFields(i).items(): 85 kwargs[field_name] = field.get(assignment) 86 a['kwargs'] = kwargs 87 return a 88 89 def extractSiteWidePortlets(context, managers): 90 """ Extract site-wide portlets 91 Data structure: 92 '__site-wide-portlets__', [(<manager1_name>, <manager1_info>), 93 (<manager2_name>, <manager2_info>), 94 (<manager3_name>, <manager3_info>)]) 95 <manager_info>: 96 {'category1' : <catmapping1>, 97 'category2' : <catmapping2>} 98 <catmapping>: 99 {'key1' : <mapping1>, 100 'key2' : <mapping2>} 101 <mapping>: 102 {'assignment_name1' : <assignment1>, 103 'assignment_name2' : <assignment2>} 104 <assignment>: 105 {'name' : 'Assignment', 106 'class' : 'dotted.path.to.assignment.class', 107 'kwargs' : {'parameter1' : 'value1', 108 'parameter2' : 'value2'} 109 """ 110 info = [] 111 for manager_name, manager in managers: 112 manager_info = {} 113 for category, catmapping in manager.items(): 114 catmapping_info = {} 115 for key, mapping in catmapping.items(): 116 mapping_info = {} 117 for name, assignment in mapping.items(): 118 mapping_info[name] = extractInfoFromAssignment(name, assignment) 119 catmapping_info[key] = mapping_info 120 manager_info[category] = catmapping_info 121 info.append((manager_name, manager_info)) 122 return info 123 124 def extractContextPortletsFromManager(context, manager): 125 """ Extract all contextual portlets from given object and portlet manager, and portlets blacklists 126 Data structure: 127 <manager_info> = 128 {'blacklists' : [(GROUP_CATEGORY, True), 129 (CONTENT_TYPE_CATEGORY, False), 130 (CONTEXT_CATEGORY, None)], 131 'assignments' : [{'name' : 'Assignment-2', 132 'class' : 'dotted.path.to.assignment.class', 133 'kwargs' : {'parameter1' : 'value1', 134 'parameter2' : 'value2'}}, 135 {'name' : 'Assignment', 136 'class' : 'dotted.path.to.assignment.class', 137 'kwargs' : {'parameter1' : 'value1', 138 'parameter2' : 'value2'}]} 139 """ 77 140 78 141 info = {} 79 80 leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=context) 81 rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=context) 82 83 left = getMultiAdapter((context, leftColumn,), IPortletAssignmentMapping, context=context) 84 right = getMultiAdapter((context, rightColumn,), IPortletAssignmentMapping, context=context) 85 86 leftassignable = getMultiAdapter((context, leftColumn,), ILocalPortletAssignmentManager) 87 rightassignable = getMultiAdapter((context, rightColumn,), ILocalPortletAssignmentManager) 88 89 info['left_slots_blacklists'] = {GROUP_CATEGORY : leftassignable.getBlacklistStatus(GROUP_CATEGORY), 90 CONTENT_TYPE_CATEGORY : leftassignable.getBlacklistStatus(CONTENT_TYPE_CATEGORY), 91 CONTEXT_CATEGORY : leftassignable.getBlacklistStatus(CONTEXT_CATEGORY)} 92 93 info['right_slots_blacklists'] = {GROUP_CATEGORY : rightassignable.getBlacklistStatus(GROUP_CATEGORY), 94 CONTENT_TYPE_CATEGORY : rightassignable.getBlacklistStatus(CONTENT_TYPE_CATEGORY), 95 CONTEXT_CATEGORY : rightassignable.getBlacklistStatus(CONTEXT_CATEGORY)} 96 97 info['add_left_slots'] = [] 98 for name, portlet in left.items(): 99 for i in list(providedBy(portlet)): 100 if i.isOrExtends(IPortletDataProvider): 101 kwargs = {} 102 for fn, field in getFields(i).items(): 103 kwargs[fn] = field.get(portlet) 104 info['add_left_slots'].append({'name' : name, 105 'type' : name, 106 'kwargs' : kwargs}) 107 108 info['add_right_slots'] = [] 109 for name, portlet in right.items(): 110 for i in list(providedBy(portlet)): 111 if i.isOrExtends(IPortletDataProvider): 112 kwargs = {} 113 for fn, field in getFields(i).items(): 114 kwargs[fn] = field.get(portlet) 115 info['add_right_slots'].append({'name' : name, 116 'type' : name, 117 'kwargs' : kwargs}) 118 119 info['remove_left_slots'] = [] 120 info['remove_right_slots'] = [] 121 122 slot_structure.append(('/'.join(context.getPhysicalPath()[2:]), info)) 142 info['assignments'] = assignments = [] 143 info['blacklists'] = blacklists = [] 144 145 # Extract contextual portlets 146 mapping = getMultiAdapter((context, manager), IPortletAssignmentMapping, context=context) 147 for name, assignment in mapping.items(): 148 assignments.append(extractInfoFromAssignment(name, assignment)) 149 150 # Extract blacklists for given object and manager 151 localassignmentmanager = getMultiAdapter((context, manager), ILocalPortletAssignmentManager) 152 blacklist = localassignmentmanager._getBlacklist() 153 if blacklist is not None: 154 for category, key in blacklist.items(): 155 blacklists.append((category, key)) 156 157 return info 158 159 def extractPortletsFromContext(context, slot_structure, typesToShow, managers): 160 """ Extract portlets for given object assigned through all portlet managers. 161 Data structure: 162 ('unique/path/to/context', [(<manager1_name>, <manager1_info>), 163 (<manager2_name>, <manager2_info>), 164 (<manager3_name>, <manager3_info>)]) 165 """ 166 167 168 info = [] 169 key = '/'.join(context.getPhysicalPath()[2:]) 170 171 for name, manager in managers: 172 info.append((name, extractContextPortletsFromManager(context, manager))) 173 174 slot_structure.append((key, info)) 123 175 124 176 return slot_structure 125 177 126 def dumpAllPortlets(context, slot_structure, typesToShow ):127 extractPortletsFromContext(context, slot_structure, typesToShow )178 def dumpAllPortlets(context, slot_structure, typesToShow, managers): 179 extractPortletsFromContext(context, slot_structure, typesToShow, managers) 128 180 if getattr(context.aq_base, 'isPrincipiaFolderish', 0): 129 181 for id, obj in context.contentItems(): 130 182 if obj.portal_type in typesToShow: 131 dumpAllPortlets(obj, slot_structure, typesToShow )183 dumpAllPortlets(obj, slot_structure, typesToShow, managers) 132 184 133 185 return slot_structure 134 186 135 187 def dumpPortlets(context, dump_policy, dump_portlets_selection): 188 """ Extract portlets from given set of objects and site-wide portlets too. 189 Data structure: 190 SLOT_STRUCTURE = 191 [(), (), ()] 192 """ 136 193 137 194 portal = getToolByName(context, 'portal_url').getPortalObject() … … 139 196 typesToShow = portal_state.friendly_types() 140 197 198 components = getSiteManager(context) 199 managers = [r for r in components.registeredUtilities() if r.provided.isOrExtends(IPortletManager)] 200 context_managers = [(m.name, getUtility(IPortletManager, name=m.name, context=context)) for m in managers 201 if not IPlacelessPortletManager.providedBy(m.component)] 202 managers = [(m.name, getUtility(IPortletManager, name=m.name, context=context)) for m in managers] 203 141 204 slot_structure = [] 142 205 if dump_policy == 'root': 143 extractPortletsFromContext(portal, slot_structure, typesToShow )206 extractPortletsFromContext(portal, slot_structure, typesToShow, context_managers) 144 207 elif dump_policy == 'all': 145 dumpAllPortlets(portal, slot_structure, typesToShow )208 dumpAllPortlets(portal, slot_structure, typesToShow, context_managers) 146 209 elif dump_policy == 'selection': 147 210 for ppath in dump_portlets_selection: 148 211 obj = portal.restrictedTraverse(ppath) 149 extractPortletsFromContext(obj, slot_structure, typesToShow) 212 extractPortletsFromContext(obj, slot_structure, typesToShow, context_managers) 213 214 slot_structure.append(('__site-wide-portlets__', extractSiteWidePortlets(portal, managers))) 150 215 151 216 return slot_structure qPloneSkinDump/branches/plone_3.0/version.txt
r999 r1010 1 0.8. 01 0.8.1
