/plone/app/kss/commands/refreshportlet.py

https://github.com/plone/plone.app.kss · Python · 64 lines · 48 code · 4 blank · 12 comment · 3 complexity · f2c18b3ce8b3d67561515d2f4e8d68ae MD5 · raw file

  1. from zope.deprecation import deprecate
  2. from kss.core.BeautifulSoup import BeautifulSoup
  3. from kss.core import CommandSet
  4. from plone.app.portlets.utils import assignment_from_key
  5. from plone.portlets.utils import unhashPortletInfo
  6. from plone.portlets.interfaces import IPortletManager, IPortletRenderer
  7. from plone.app.portlets.interfaces import IDeferredPortletRenderer
  8. from zope.component import getMultiAdapter, getUtility
  9. # XXX: This is deprecated and will be removed in Plone 3.5. Use the 'plone'
  10. # command set instead.
  11. class RefreshPortletCommand(CommandSet):
  12. @deprecate("The 'refreshportlet' command set is deprecated and will be removed in Plone 3.5. "
  13. "Please use the 'plone' command set instead.")
  14. def refreshPortletLegacy(self, name, nodeid=None, **kw):
  15. 'Refresh portlet by name (old portlets)'
  16. if name.startswith('portlet-'):
  17. name = name[8:]
  18. if nodeid is None:
  19. nodeid = name
  20. # render it
  21. portlet_body = self.view.macroContent('portlet_%s/macros/portlet' % (name, ), **kw)
  22. # Good. Now, unfortunately we don't have any marker on the outside div.
  23. # So we just select the <dl> for insertion.
  24. # This could be spared with smarter templating.
  25. soup = BeautifulSoup(portlet_body)
  26. tag = soup.find('dl', id=nodeid)
  27. result = unicode(tag)
  28. # Command the replacement
  29. ksscore = self.getCommandSet('core')
  30. ksscore.replaceHTML(ksscore.getHtmlIdSelector(nodeid), result)
  31. @deprecate("The 'refreshportlet' command set is deprecated and will be removed in Plone 3.5. "
  32. "Please use the 'plone' command set instead.")
  33. def refreshPortlet(self, portlethash, **kw):
  34. 'Refresh portlet by its hash (new portlets)'
  35. # put parameters on the request, by saving the original context
  36. self.request.form, orig_form = kw, self.request.form
  37. # Prepare the portlet and render the data
  38. info = unhashPortletInfo(portlethash)
  39. manager = getUtility(IPortletManager, info['manager'])
  40. assignment = assignment_from_key(context = self.context,
  41. manager_name = info['manager'],
  42. category = info['category'],
  43. key = info['key'],
  44. name = info['name'])
  45. renderer = getMultiAdapter(
  46. (self.context, self.request, self.view, manager, assignment.data),
  47. IPortletRenderer
  48. )
  49. renderer = renderer.__of__(self.context)
  50. renderer.update()
  51. if IDeferredPortletRenderer.providedBy(renderer):
  52. # if this is a deferred load, prepare now the data
  53. renderer.deferred_update()
  54. result = renderer.render()
  55. # Revert the original request
  56. self.request.form = orig_form
  57. # Command the replacement
  58. wrapper_id = 'portletwrapper-%s' % portlethash
  59. ksscore = self.getCommandSet('core')
  60. ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector(wrapper_id), result)