Changeset 1564 in products


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

implemented section for importing of portlet assignments

Location:
quintagroup.transmogrifier/trunk/quintagroup/transmogrifier
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.transmogrifier/trunk/quintagroup/transmogrifier/configure.zcml

    r1563 r1564  
    135135        name="quintagroup.transmogrifier.portletsimporter" 
    136136        /> 
     137 
     138    <adapter factory=".portlets.PortletAssignmentExportImportHandler" /> 
    137139 
    138140    <transmogrifier:registerConfig 
  • 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() 
  • quintagroup.transmogrifier/trunk/quintagroup/transmogrifier/portlets.txt

    r1563 r1564  
    4444... [portletsimporter] 
    4545... blueprint = quintagroup.transmogrifier.portletsimporter 
     46... files-key = files 
    4647... """ 
    4748>>> registerConfig(u'quintagroup.transmogrifier.tests.portlets', portlets) 
     
    7172</portlets> 
    7273<BLANKLINE> 
    73 >>> pprint.pprint(plone.updated) 
    74 () 
     74{'_path': 'other-assignable', 
     75 'files': {'portlets': {'data': ... 
     76                        'name': '.portlets.xml'}}} 
     77>>> 'habra-rss' in mapping 
     78True 
     79>>> mapping['habra-rss'].count 
     8020 
     81>>> mapping['habra-rss'].url 
     82u'http://habrahabr.ru/rss/' 
     83>>> mapping['habra-rss'].portlet_title 
     84u'Habrahabr RSS feed' 
     85>>> mapping['habra-rss'].timeout 
     86120 
  • quintagroup.transmogrifier/trunk/quintagroup/transmogrifier/tests.py

    r1563 r1564  
    10551055            return [''] + self._last_path.split('/') 
    10561056 
    1057         updated = () 
    1058         def _updateProperty(self, id, value): 
    1059             self.updated += ((self._last_path, id, value)) 
    1060  
    10611057    portal = MockPortal() 
    10621058    test.globs['plone'] = portal 
     
    10741070                dict(_path='spam/eggs/notassignable'), 
    10751071                dict(_path='assignable'), 
     1072                dict(_path='other-assignable',  
     1073                    files=dict(portlets=dict( 
     1074                        name='.portlets.xml', 
     1075                        data="""<?xml version="1.0" encoding="utf-8"?> 
     1076<portlets> 
     1077  <assignment category="context" key="/other-assignable" manager="plone.leftcolumn" name="habra-rss" type="portlets.rss"> 
     1078    <property name="count"> 
     1079      20 
     1080    </property> 
     1081    <property name="url"> 
     1082      http://habrahabr.ru/rss/ 
     1083    </property> 
     1084    <property name="portlet_title"> 
     1085      Habrahabr RSS feed 
     1086    </property> 
     1087    <property name="timeout"> 
     1088      120 
     1089    </property> 
     1090  </assignment> 
     1091</portlets> 
     1092""") 
     1093                    ) 
     1094                ) 
    10761095            ) 
    10771096 
     
    11001119    provideAdapter(localPortletAssignmentMappingAdapter) 
    11011120    mapping = getMultiAdapter((portal, manager), IPortletAssignmentMapping) 
     1121    test.globs['mapping'] = mapping 
    11021122 
    11031123    # register portlet (this is what plone:portlet zcml directive does) 
     
    11331153        field.set(assignment, v) 
    11341154 
    1135     # register adapter for portlet assignment export/import 
    1136     from plone.app.portlets.exportimport.portlets import PropertyPortletAssignmentExportImportHandler 
    1137     provideAdapter(PropertyPortletAssignmentExportImportHandler) 
    1138  
    11391155def test_suite(): 
    11401156    import sys 
Note: See TracChangeset for help on using the changeset viewer.