From 8ccd192a25900e09895d6bb41b826e95eca1a751 Mon Sep 17 00:00:00 2001 From: Laurent Lasudry Date: Tue, 6 Nov 2018 06:54:04 +0100 Subject: [PATCH] Cache objects only for the time of the request Caching was too aggressive and could lead to ConnectionStateError --- .../dms/basecontent/browser/column.py | 33 ++++++++++--------- .../dms/basecontent/browser/listing.py | 2 +- .../dms/basecontent/browser/table.py | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/collective/dms/basecontent/browser/column.py b/src/collective/dms/basecontent/browser/column.py index c0fddaa..1d1726b 100644 --- a/src/collective/dms/basecontent/browser/column.py +++ b/src/collective/dms/basecontent/browser/column.py @@ -34,19 +34,19 @@ class Column(z3c.table.column.Column, grok.MultiAdapter): translate(self.header, context=self.request)) -def _get_value_cachekey(method, item, attribute, default=None): +def _get_value_cachekey(method, request, item, attribute, default=None): return (item.getPath(), item.modified, attribute, default) @ram.cache(_get_value_cachekey) -def get_value(item, attribute, default=None): +def get_value(request, item, attribute, default=None): try: value = getattr(item, attribute) if value is Missing.Value: return default except AttributeError: try: - obj = item.getObject() + obj = get_object(request, item) except KeyError: # ouch return '-' @@ -58,11 +58,12 @@ def get_value(item, attribute, default=None): return value -def _get_object_cachekey(method, item): - return (item.getPath(), item.modified) +def _get_object_cachekey(method, request, item): + return (item.getPath(), request.__dict__) + @ram.cache(_get_object_cachekey) -def get_object(item): +def get_object(request, item): try: obj = item.getObject() except KeyError: @@ -77,7 +78,7 @@ class DateColumn(Column): attribute = NotImplemented def renderCell(self, item): - value = get_value(item, self.attribute) + value = get_value(self.request, item, self.attribute) return self.table.format_date(value) @@ -86,7 +87,7 @@ class DateTimeColumn(Column): attribute = NotImplemented def renderCell(self, item): - value = get_value(item, self.attribute) + value = get_value(self.request, item, self.attribute) return self.table.format_date(value, long_format=True) @@ -95,7 +96,7 @@ class PrincipalColumn(Column): attribute = NotImplemented def renderCell(self, item): - value = get_value(item, self.attribute, default=()) + value = get_value(self.request, item, self.attribute, default=()) if not isinstance(value, (list, tuple)): value = (value,) @@ -139,7 +140,7 @@ class TitleColumn(LinkColumn): cssClasses = {'td': 'title-column'} def getLinkContent(self, item): - title = get_value(item, 'Title') + title = get_value(self.request, item, 'Title') if isinstance(title, unicode): return title else: @@ -181,7 +182,7 @@ class DeleteColumn(IconColumn, LinkColumn): linkContent = PMF(u"Delete") def actionAvailable(self, item): - obj = get_object(item) + obj = get_object(self.request, item) if not obj: return False sm = getSecurityManager() @@ -212,7 +213,7 @@ class ExternalEditColumn(IconColumn, LinkColumn): linkContent = PMF(u"Edit with external application") def actionAvailable(self, item): - obj = get_object(item) + obj = get_object(self.request, item) if not obj: return False sm = getSecurityManager() @@ -248,7 +249,7 @@ class EditColumn(IconColumn, LinkColumn): linkCSS = 'overlay-form-reload' def actionAvailable(self, item): - obj = get_object(item) + obj = get_object(self.request, item) if not obj: return False sm = getSecurityManager() @@ -269,8 +270,8 @@ class StateColumn(Column): def renderCell(self, item): try: wtool = self.table.wtool - portal_type = get_value(item, 'portal_type') - review_state = get_value(item, 'review_state') + portal_type = get_value(self.request, item, 'portal_type') + review_state = get_value(self.request, item, 'review_state') if not review_state: return u"" state_title = wtool.getTitleForStateOnType(review_state, @@ -289,7 +290,7 @@ class LabelColumn(Column): attribute = NotImplemented def renderCell(self, item): - value = get_value(item, self.attribute) + value = get_value(self.request, item, self.attribute) if value is None or value == 'None': value = '' return value diff --git a/src/collective/dms/basecontent/browser/listing.py b/src/collective/dms/basecontent/browser/listing.py index bb16273..3495b2d 100644 --- a/src/collective/dms/basecontent/browser/listing.py +++ b/src/collective/dms/basecontent/browser/listing.py @@ -81,7 +81,7 @@ class AppendixTitleColumn(column.Column): header = PMF("Title") def renderCell(self, item): - title = column.get_value(item, 'Title') + title = column.get_value(self.request, item, 'Title') if isinstance(title, unicode): return title else: diff --git a/src/collective/dms/basecontent/browser/table.py b/src/collective/dms/basecontent/browser/table.py index 13bb55d..d83cfb4 100644 --- a/src/collective/dms/basecontent/browser/table.py +++ b/src/collective/dms/basecontent/browser/table.py @@ -96,7 +96,7 @@ class Table(z3c.table.table.Table): state_column = [x for x in row if isinstance(x[1], StateColumn)] if state_column: state_column = state_column[0] - state_value = get_value(state_column[0], 'review_state') + state_value = get_value(self.request, state_column[0], 'review_state') if state_value: cssClass += ' row-state-%s' % state_value