diff --git a/product/ERP5Form/ProxyField.py b/product/ERP5Form/ProxyField.py index 680fb70d057fe68caf2ca66f0b4fe405e51494bd..d137feeb3fc26888fae16710ea1aeb308ad75bb1 100644 --- a/product/ERP5Form/ProxyField.py +++ b/product/ERP5Form/ProxyField.py @@ -567,8 +567,9 @@ class ProxyField(ZMIField): field = REQUEST.get('field__proxyfield_%s_%s' % (self.id, id), self) REQUEST.set('field__proxyfield_%s_%s' % (proxy_field.id, id), field) - # Don't use cache if field is not stored in zodb. - if self._p_oid is None: + # Don't use cache if field is not stored in zodb, or if target field is + # defined by a TALES + if self._p_oid is None or self.tales['field_id'] or self.tales['form_id']: return self._get_value(id, **kw) cache_id = ('ProxyField.get_value', diff --git a/product/ERP5Form/tests/testFields.py b/product/ERP5Form/tests/testFields.py index 6aaf2951c6e473e56929709bbbe9ef8d9b6f2879..ea5ab1ca38055d7c8986abae3c7c0a4055a16bc9 100644 --- a/product/ERP5Form/tests/testFields.py +++ b/product/ERP5Form/tests/testFields.py @@ -30,6 +30,7 @@ import unittest # Make it possible to use Globals.get_request class DummyRequest(dict): + __allow_access_to_unprotected_subobjects__ = 1 def set(self, k, v): self[k] = v @@ -226,6 +227,26 @@ class TestProxyField(unittest.TestCase): field_id='my_title',)) self.assertEquals('Base_view', proxy_field.get_value('title')) + def test_get_value_cache_on_TALES_target(self): + # If the proxy field defines its target using TALES, then no caching should + # happen. + original_field = self.addField(self.container.Base_viewProxyFieldLibrary, + 'my_title', 'Title', 'StringField') + other_field = self.addField(self.container.Base_viewProxyFieldLibrary, + 'my_other_field', 'Other', 'StringField') + proxy_field = self.addField(self.container.Base_view, + 'my_id', 'ID', 'ProxyField') + proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary')) + proxy_field.manage_tales_xmlrpc(dict(field_id='request/field_id')) + + self.container.REQUEST.set('field_id', 'my_title') + self.assertEquals(original_field, proxy_field.getTemplateField()) + self.assertEquals('Title', proxy_field.get_value('title')) + + self.container.REQUEST.set('field_id', 'my_other_field') + self.assertEquals(other_field, proxy_field.getTemplateField()) + self.assertEquals('Other', proxy_field.get_value('title')) + class TestFieldValueCache(unittest.TestCase): """Tests field value caching system