From 9fa3e98a8465beb38f7d735175401182aa31bace Mon Sep 17 00:00:00 2001 From: hvelarde Date: Tue, 24 Apr 2018 14:41:19 -0300 Subject: [PATCH] Avoid using an instance memoizer in the portlet as it could cause harm refs. https://community.plone.org/t/using-plone-memoize-instance-with-several-zeo-clients/1620 --- CHANGES.rst | 3 +- .../periodicals/portlets/latest_periodical.py | 37 ++++++------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 51d2329..9628d3e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,8 @@ Changelog 1.1b2 (unreleased) ^^^^^^^^^^^^^^^^^^ -- Nothing changed yet. +- Avoid using an instance memoizer in the portlet as it could cause harm. + [hvelarde] 1.1b1 (2017-06-12) diff --git a/src/sc/periodicals/portlets/latest_periodical.py b/src/sc/periodicals/portlets/latest_periodical.py index bc52d95..6ef8de7 100644 --- a/src/sc/periodicals/portlets/latest_periodical.py +++ b/src/sc/periodicals/portlets/latest_periodical.py @@ -4,8 +4,8 @@ from plone.app.portlets.cache import render_cachekey from plone.app.portlets.portlets import base from plone.memoize import ram +from plone.memoize import view from plone.memoize.compress import xhtml_compress -from plone.memoize.instance import memoize from plone.portlets.interfaces import IPortletDataProvider from Products.CMFCore.utils import getToolByName from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile @@ -13,12 +13,11 @@ from sc.periodicals.content import IPeriodical from zope import schema from zope.formlib import form -from zope.interface import implements +from zope.interface import implementer class ILatestPeriodicalPortlet(IPortletDataProvider): - """This portlet shows the latest published periodical. - """ + """This portlet shows the latest published periodical.""" header = schema.TextLine( title=_(u'Portlet header'), @@ -49,14 +48,8 @@ class ILatestPeriodicalPortlet(IPortletDataProvider): required=False) +@implementer(ILatestPeriodicalPortlet) class Assignment(base.Assignment): - """ - Portlet assignment. - This is what is actually managed through the portlets UI and associated - with columns. - """ - - implements(ILatestPeriodicalPortlet) def __init__(self, header=u'', image_scale=None, count=5, text=u''): @@ -67,9 +60,6 @@ def __init__(self, header=u'', image_scale=None, count=5, text=u''): @property def title(self): - """This property is used to give the title of the portlet in the - "manage portlets" screen. Here, we use the title that the user gave. - """ return _(u'Latest Periodical') @@ -77,9 +67,6 @@ class Renderer(base.Renderer): _template = ViewPageTemplateFile('latest_periodical.pt') - def __init__(self, *args): - base.Renderer.__init__(self, *args) - @ram.cache(render_cachekey) def render(self): return xhtml_compress(self._template()) @@ -93,6 +80,7 @@ def available(self): def title(self): return self.data.header + @view.memoize def get_latest_periodical(self): """ @return: returns the catalog results (brains) if exists @@ -104,20 +92,19 @@ def get_latest_periodical(self): sort_order='reverse', review_state='published', ) - + assert results in (0, 1) return results[0] if results else None def published_news_articles(self): return self._data() - @memoize def _data(self): """ @return:returns the articles in a periodical """ periodical = self.get_latest_periodical() if periodical is None: - return [] + return () context = aq_inner(self.context) catalog = getToolByName(context, 'portal_catalog') @@ -132,7 +119,7 @@ def _data(self): sort_limit=count, ) - return articles[:count] if articles else [] + return articles[:count] if articles else () def get_image_scale(self): return self.data.image_scale @@ -148,6 +135,7 @@ def get_text(self, mt='text/x-html-safe'): orig = self.data.text if not orig: orig = u'' + context = aq_inner(self.context) if not isinstance(orig, unicode): # Apply a potentially lossy transformation, and hope we stored @@ -158,10 +146,9 @@ def get_text(self, mt='text/x-html-safe'): # Portal transforms needs encoded strings orig = orig.encode('utf-8') - transformer = getToolByName(context, 'portal_transforms') - data = transformer.convertTo(mt, orig, - context=context, mimetype='text/html') + data = transformer.convertTo( + mt, orig, context=context, mimetype='text/html') result = data.getData() if result: if isinstance(result, str): @@ -171,7 +158,7 @@ def get_text(self, mt='text/x-html-safe'): def get_periodical_title(self): periodical = self.get_latest_periodical() - return periodical.Title if periodical is not None else None + return periodical.Title if periodical else '' class AddForm(base.AddForm):