
Imports.
  >>> from zope.component import getUtility, getAdapter, getMultiAdapter
  >>> from plone.portlets.interfaces import IPortletManager, IPortletRetriever
  >>> from plone.portlets.utils import hashPortletInfo
  >>> from collective.weightedportlets.tests.base import browser
  >>> from Products.GenericSetup.tests.common import DummyImportContext, DummyExportContext
  >>> from plone.app.portlets.exportimport.portlets import importPortlets, exportPortlets
  >>> from plone.app.portlets.exportimport.interfaces import IPortletAssignmentExportImportHandler
  >>> from collective.weightedportlets import ATTR

Portlet weighting
=================

Check the initial listing of portlets in the left column at the site root.
  >>> view = self.portal.restrictedTraverse('@@plone')
  >>> manager = getUtility(IPortletManager, name='plone.leftcolumn', context=self.portal)
  >>> retriever = getMultiAdapter((self.portal, manager), IPortletRetriever)
  >>> [p['name'] for p in retriever.getPortlets()]
  [u'navigation', u'login']

Open the portlet management screen.
  >>> browser.open('http://nohost/plone/@@manage-portlets')

Make sure there is a weight input for each portlet.
  >>> print browser.contents
  <!DOCTYPE...
  <input type="text" size="1" class="weight" title="Portlet Weight" value="50" />
  ...
  <input type="text" size="1" class="weight" title="Portlet Weight" value="50" />
  ...

Now we call the KSS action which would normally be triggered by Javascript
when the weight input is changed.  We'll lower the weight of the login portlet...
  >>> portlethash = hashPortletInfo(dict(manager='plone.leftcolumn', category='context', name='login', key='/plone'))
  >>> browser.open('http://nohost/plone/@@inlineChangePortletWeight?portlethash=%s&viewname=%s&weight=%s' % (portlethash, 'manage-portlets', 30))
  >>> 'replaceInnerHTML' in browser.contents
  True

(If we try to set a value that isn't an integer, we'll get an error message.)
  >>> browser.open('http://nohost/plone/@@inlineChangePortletWeight?portlethash=%s&viewname=%s&weight=%s' % (portlethash, 'manage-portlets', 'a'))
  >>> 'You must enter an integer for the portlet weight.' in browser.contents
  True

Now confirm that the login portlet gets sorted above the navigation portlet.
  >>> [p['name'] for p in retriever.getPortlets()]
  [u'login', u'navigation']


GenericSetup Import/Export
==========================

Portlet weights can be included when loading portlet assignments using GenericSetup.
  >>> context = DummyImportContext(self.portal, purge=False)
  >>> context._files['portlets.xml'] = """<?xml version="1.0"?>
  ... <portlets>
  ...    <assignment
  ...        name="testportlet"
  ...        type="portlets.Calendar"
  ...        manager="plone.leftcolumn"
  ...        category="context"
  ...        key="/"
  ...        weight="40"
  ...    />
  ... </portlets>"""
  >>> importPortlets(context)
  >>> portlets = retriever.getPortlets()
  >>> [p['name'] for p in portlets]
  [u'login', u'testportlet', u'navigation']
  >>> getattr(portlets[1]['assignment'], ATTR, {}).get('weight')
  40

And they are also included when exporting portlet assignments.
  >>> context = DummyExportContext(self.portal)
  >>> exportPortlets(context)
  >>> print context._wrote[0][1]
  <?xml...<assignment name="testportlet" category="context" key="/" manager="plone.leftcolumn" type="portlets.Calendar" weight="40"/>...


Uninstallation
==============

Uninstall the product.
  >>> self.portal.portal_quickinstaller.uninstallProducts(['collective.weightedportlets'])

Now make sure that our local override of the portlet retriever has been removed.
  >>> getMultiAdapter((self.portal, manager), IPortletRetriever)
  <plone.portlets.retriever.PortletRetriever object at ...>

And same for the override of the assignment importer/exporter.
  >>> getAdapter(self.portal, IPortletAssignmentExportImportHandler)
  <plone.app.portlets.exportimport.portlets.PropertyPortletAssignmentExportImportHandler object at ...>
