Cache objects only for the time of the request

Caching was too aggressive and could lead to ConnectionStateError
This commit is contained in:
Laurent Lasudry 2018-11-06 06:54:04 +01:00
parent fd7ee3bf04
commit 8ccd192a25
3 changed files with 19 additions and 18 deletions

View File

@ -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

View File

@ -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:

View File

@ -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