Commit 9080eccf authored by Rafael Monnerat's avatar Rafael Monnerat Committed by Xiaowu Zhang

Introduce _cacheable_key to custom cache entries per field type

  This is required by Listbox for example in order to cache per list_start.
parent 15d3c832
...@@ -31,7 +31,7 @@ from OFS.Traversable import NotFound ...@@ -31,7 +31,7 @@ from OFS.Traversable import NotFound
from AccessControl import ClassSecurityInfo, Unauthorized from AccessControl import ClassSecurityInfo, Unauthorized
from Products.Formulator.DummyField import fields from Products.Formulator.DummyField import fields
from Products.Formulator import Widget, Validator from Products.Formulator import Widget, Validator
from Products.Formulator.Field import ZMIField from Products.Formulator.Field import Field, ZMIField
from Products.Formulator.Errors import FormValidationError, ValidationError from Products.Formulator.Errors import FormValidationError, ValidationError
from Selection import Selection, DomainSelection from Selection import Selection, DomainSelection
from Tool.SelectionTool import createFolderMixInPageSelectionMethod from Tool.SelectionTool import createFolderMixInPageSelectionMethod
...@@ -2954,6 +2954,17 @@ class ListBox(ZMIField): ...@@ -2954,6 +2954,17 @@ class ListBox(ZMIField):
else: else:
return ZMIField.get_value(self, id, **kw) return ZMIField.get_value(self, id, **kw)
def _cacheable_key(self):
selection_tool = self.getPortalObject().portal_selections
selection_name = self.get_value('selection_name')
selection = selection_tool.getSelectionFor(selection_name, REQUEST =self.REQUEST)
if selection is not None:
key = ("list_start", selection.getParams().get("list_start"))
return key
return "default"
security.declareProtected('Access contents information', 'getListMethodName') security.declareProtected('Access contents information', 'getListMethodName')
def getListMethodName(self): def getListMethodName(self):
"""Return the name of the list method. If not defined, return None. """Return the name of the list method. If not defined, return None.
......
...@@ -761,6 +761,15 @@ class ProxyField(ZMIField): ...@@ -761,6 +761,15 @@ class ProxyField(ZMIField):
if proxy_field is not None: if proxy_field is not None:
return proxy_field.get_value(id, **kw) return proxy_field.get_value(id, **kw)
def _cacheable_key(self):
selection_name = self.get_value('selection_name')
if selection_name is not None:
selection_tool = self.getPortalObject().portal_selections
selection = selection_tool.getSelectionFor(selection_name, REQUEST = self.REQUEST)
if selection is not None:
return ("list_start", selection.getParams().get("list_start"))
return "default"
def _getCacheId(self): def _getCacheId(self):
return '%s%s' % ('ProxyField', self._p_oid or repr(self)) return '%s%s' % ('ProxyField', self._p_oid or repr(self))
......
...@@ -491,6 +491,9 @@ class ZMIField( ...@@ -491,6 +491,9 @@ class ZMIField(
"""The title of this field.""" """The title of this field."""
return self.get_value('title') return self.get_value('title')
def _cacheable_key(self):
return "default"
# display edit screen as main management screen # display edit screen as main management screen
security.declareProtected('View management screens', 'manage_main') security.declareProtected('View management screens', 'manage_main')
manage_main = DTMLFile('dtml/fieldEdit', globals()) manage_main = DTMLFile('dtml/fieldEdit', globals())
...@@ -721,7 +724,8 @@ class ZMIField( ...@@ -721,7 +724,8 @@ class ZMIField(
keyset = {'here': self, keyset = {'here': self,
'value': value, 'value': value,
'render_prefix' : render_prefix, 'render_prefix' : render_prefix,
'key_prefix': key_prefix} 'key_prefix': key_prefix,
'widget_keyset': self._cacheable_key()}
LOG("ZMIField.render_htmlgrid", 0, keyset) LOG("ZMIField.render_htmlgrid", 0, keyset)
result = self.ZCacheable_get(keywords=keyset) result = self.ZCacheable_get(keywords=keyset)
if result is not None: if result is not None:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment