From 0b80c75db597192084df8403fe1dbffc9e32787c Mon Sep 17 00:00:00 2001 From: Jean-Paul Smets <jp@nexedi.com> Date: Wed, 3 Jan 2007 18:40:02 +0000 Subject: [PATCH] Prevent ZODB from exploding. Make class accessor stronger. Make system more dynamic. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@11884 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/TranslationProviderBase.py | 36 +++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/product/ERP5Type/TranslationProviderBase.py b/product/ERP5Type/TranslationProviderBase.py index ee9db63cc2..ca4558a16c 100644 --- a/product/ERP5Type/TranslationProviderBase.py +++ b/product/ERP5Type/TranslationProviderBase.py @@ -26,6 +26,8 @@ import Products from zLOG import LOG +_MARKER = {} + class TranslationProviderBase: """ Provide Translation Tabs and management methods for PropertyTranslationDomain @@ -43,8 +45,8 @@ class TranslationProviderBase: , ) - security.declarePrivate( 'createInitialPropertyTranslationDomainDict' ) - def createInitialPropertyTranslationDomainDict(self, ): + security.declarePrivate( 'updateInitialPropertyTranslationDomainDict' ) + def updateInitialPropertyTranslationDomainDict(self, ): """ Create the initial list of association between property and domain name """ @@ -53,7 +55,7 @@ class TranslationProviderBase: # get the klass of the object based on the constructor document m = Products.ERP5Type._m ptype_name = ''.join(ptype_object.id.split(' ')) - constructor = 'add%s' %(ptype_name) + constructor = self.factory # This is safer than: 'add%s' %(ptype_name) klass = None for method, doc in m.items(): if method == constructor: @@ -81,18 +83,30 @@ class TranslationProviderBase: if prop.get('translatable', 0): prop_id = prop['id'] if not property_domain_dict.has_key(prop_id): - property_domain_dict[prop_id] = TranslationInformation(prop_id, '') - - self._property_domain_dict = property_domain_dict + domain_name = prop.get('translation_domain', None) + property_domain_dict[prop_id] = TranslationInformation(prop_id, domain_name) + + original_property_domain_dict = getattr(aq_base(self), '_property_domain_dict', {}) + original_property_domain_keys = original_property_domain_dict.keys() + property_domain_keys = property_domain_dict.keys() + property_domain_keys.sort() + original_property_domain_keys.sort() + # Only update if required in order to prevent ZODB to grow + if property_domain_keys != original_property_domain_keys: + # Update existing dict + property_domain_dict.update(original_property_domain_dict) + # And store + self._property_domain_dict = property_domain_dict security.declarePrivate( 'getPropertyTranslationDomainDict' ) def getPropertyTranslationDomainDict(self,): """ Return all the translation defined by a provider. """ - property_domain_dict = getattr(aq_base(self), '_property_domain_dict', {}) - if len(property_domain_dict) == 0: - self.createInitialPropertyTranslationDomainDict() + property_domain_dict = getattr(aq_base(self), '_property_domain_dict', _MARKER) + if len(property_domain_dict) is _MARKER: + # Force update is not defined + self.updateInitialPropertyTranslationDomainDict() return self._property_domain_dict # @@ -103,6 +117,7 @@ class TranslationProviderBase: """ Show the 'Translation' management tab. """ translation_list = [] + self.updateInitialPropertyTranslationDomainDict() # Force update in case of change of PS list prop_domain_name_dict = self.getPropertyTranslationDomainDict() keys = prop_domain_name_dict.keys() keys.sort() @@ -139,6 +154,9 @@ class TranslationProviderBase: if new_domain_name != prop_object.getDomainName(): prop_object.setDomainName(new_domain_name) + from Products.ERP5Type.Base import _aq_reset + _aq_reset() # Reset accessor cache + if REQUEST is not None: return self.manage_editTranslationForm(REQUEST, manage_tabs_message= 'Translations Updated.') -- 2.30.9