Ignore:
Timestamp:
Jan 15, 2010 10:33:16 PM (14 years ago)
Author:
koval
Message:

implemented section for importing of portlet assignments

File:
1 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.transmogrifier/trunk/quintagroup/transmogrifier/portlets.py

    r1563 r1564  
    22 
    33from zope.interface import classProvides, implements, providedBy 
    4 from zope.component import getUtilitiesFor, queryMultiAdapter 
     4from zope.component import getUtilitiesFor, queryMultiAdapter, getUtility, \ 
     5    getMultiAdapter, adapts 
     6from zope.component.interfaces import IFactory 
     7from zope.app.container.interfaces import INameChooser 
    58 
    69from plone.portlets.interfaces import ILocalPortletAssignable, IPortletManager,\ 
    7     IPortletAssignmentMapping 
     10    IPortletAssignmentMapping, IPortletAssignment 
    811from plone.portlets.constants import CONTEXT_CATEGORY 
    912from plone.app.portlets.interfaces import IPortletTypeInterface 
    1013from plone.app.portlets.exportimport.interfaces import IPortletAssignmentExportImportHandler 
     14from plone.app.portlets.exportimport.portlets import PropertyPortletAssignmentExportImportHandler 
     15from plone.app.portlets.interfaces import IPortletTypeInterface 
    1116 
    1217from collective.transmogrifier.interfaces import ISection, ISectionBlueprint 
     
    120125                yield item; continue 
    121126 
    122             #if ILocalPortletAssignable.providedBy(obj): 
    123                 #data = None 
    124                 #data = item[fileskey]['portlets']['data'] 
    125                 #doc = minidom.parseString(data) 
    126                 #root = doc.documentElement 
    127                 #children = [k for k in root.childNodes] 
    128                 #for child in children: 
    129                     #if child.nodeName != 'assignment': 
    130                         #continue 
    131                     #self.importPortlet(child) 
     127            if ILocalPortletAssignable.providedBy(obj): 
     128                data = None 
     129                data = item[fileskey]['portlets']['data'] 
     130                doc = minidom.parseString(data) 
     131                root = doc.documentElement 
     132                for elem in root.childNodes: 
     133                    if elem.nodeName == 'assignment': 
     134                        self.importAssignment(obj, elem) 
     135                    #elif elem.nodeName == 'blacklist': 
     136                        #self.importBlacklist(obj, elem) 
    132137 
    133138            yield item 
     139 
     140    def importAssignment(self, obj, node): 
     141        """ Import an assignment from a node 
     142        """ 
     143        # 1. Determine the assignment mapping and the name 
     144        manager_name = node.getAttribute('manager') 
     145        category = node.getAttribute('category') 
     146 
     147        manager = getUtility(IPortletManager, manager_name) 
     148        mapping = getMultiAdapter((obj, manager), IPortletAssignmentMapping) 
     149 
     150        # 2. Either find or create the assignment 
     151        assignment = None 
     152        name = node.getAttribute('name') 
     153        if name: 
     154            assignment = mapping.get(name, None) 
     155 
     156        type_ = node.getAttribute('type') 
     157 
     158        if assignment is None: 
     159            portlet_factory = getUtility(IFactory, name=type_) 
     160            assignment = portlet_factory() 
     161 
     162            if not name: 
     163                chooser = INameChooser(mapping) 
     164                name = chooser.chooseName(None, assignment) 
     165 
     166            mapping[name] = assignment 
     167 
     168        # aq-wrap it so that complex fields will work 
     169        assignment = assignment.__of__(obj) 
     170 
     171        # 3. Use an adapter to update the portlet settings 
     172        portlet_interface = getUtility(IPortletTypeInterface, name=type_) 
     173        assignment_handler = IPortletAssignmentExportImportHandler(assignment) 
     174        assignment_handler.import_assignment(portlet_interface, node) 
     175 
     176class PortletAssignmentExportImportHandler(PropertyPortletAssignmentExportImportHandler): 
     177    """ This adapter is needed because original fails to handle text from  
     178        pretty printed XML file. 
     179    """ 
     180    adapts(IPortletAssignment) 
     181 
     182    def extract_text(self, node): 
     183        text = super(PortletAssignmentExportImportHandler, self).extract_text(node) 
     184        # strip text to remove newlines and space character from the beginning  
     185        # and the end 
     186        return text.strip() 
Note: See TracChangeset for help on using the changeset viewer.