From 95f3f8f563ef10d8fb73dc9061493b31bb633d07 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Thu, 1 Mar 2012 17:27:37 +0900
Subject: [PATCH] Speed up reset in __of__.

---
 product/ERP5/ERP5Site.py                             | 12 ++++++------
 product/ERP5Type/Tool/ComponentTool.py               |  5 +++--
 product/ERP5Type/tests/testDynamicClassGeneration.py | 10 +++++-----
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/product/ERP5/ERP5Site.py b/product/ERP5/ERP5Site.py
index 465660b392..66c656f746 100644
--- a/product/ERP5/ERP5Site.py
+++ b/product/ERP5/ERP5Site.py
@@ -340,15 +340,15 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
       tv['ERP5Site.__of__'] = None
       setSite(self)
 
-      # If Components are reset, then portal type classes should be reset
       try:
-        reset_portal_type = self.portal_components.reset(force=False,
-                                                         reset_portal_type=False)
-      # This should only happen before erp5_core is installed
+        component_tool = self.portal_components
       except AttributeError:
-        reset_portal_type = False
+        # This should only happen before erp5_core is installed
+        synchronizeDynamicModules(self)
+      else:
+        # If Components are reset, then portal type classes should be reset
+        synchronizeDynamicModules(self, component_tool.reset())
 
-      synchronizeDynamicModules(self, force=True)
     return self
 
   def manage_beforeDelete(self, item, container):
diff --git a/product/ERP5Type/Tool/ComponentTool.py b/product/ERP5Type/Tool/ComponentTool.py
index 97ef9603bb..a1a884be7b 100644
--- a/product/ERP5Type/Tool/ComponentTool.py
+++ b/product/ERP5Type/Tool/ComponentTool.py
@@ -56,7 +56,7 @@ class ComponentTool(BaseTool):
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
   security.declareProtected(Permissions.ResetDynamicClasses, 'reset')
-  def reset(self, force=True, reset_portal_type=True):
+  def reset(self, force=False, reset_portal_type=False):
     """
     XXX-arnau: global reset
     """
@@ -115,4 +115,5 @@ class ComponentTool(BaseTool):
     key = 'ComponentTool.resetOnceAtTransactionBoundary'
     if key not in tv:
       tv[key] = None
-      transaction.get().addBeforeCommitHook(self.reset)
+      transaction.get().addBeforeCommitHook(self.reset,
+                                            args=(True, True))
diff --git a/product/ERP5Type/tests/testDynamicClassGeneration.py b/product/ERP5Type/tests/testDynamicClassGeneration.py
index 11e2ce9bbb..8d64004b46 100644
--- a/product/ERP5Type/tests/testDynamicClassGeneration.py
+++ b/product/ERP5Type/tests/testDynamicClassGeneration.py
@@ -1254,7 +1254,7 @@ class _TestZodbComponent(SecurityTestCase):
     self._component_tool = self.getPortal().portal_components
     self._module = __import__(self._getComponentModuleName(),
                               fromlist=['erp5.component'])
-    self._component_tool.reset()
+    self._component_tool.reset(force=True, reset_portal_type=True)
 
   @abc.abstractmethod
   def _newComponent(self, reference, text_content, version='erp5'):
@@ -1362,7 +1362,7 @@ class _TestZodbComponent(SecurityTestCase):
       self.assertEquals(error_message, error_list[0])
       self.assertEquals(component.getReference(), invalid_reference)
       self.assertEquals(component.getReference(validated_only=True), valid_reference)
-      self._component_tool.reset()
+      self._component_tool.reset(force=True, reset_portal_type=True)
       self.assertModuleImportable(valid_reference)
 
     ComponentTool.reset = assertResetCalled
@@ -1430,7 +1430,7 @@ class _TestZodbComponent(SecurityTestCase):
       self.assertEquals(error_message, error_list[0])
       self.assertEquals(component.getVersion(), invalid_version)
       self.assertEquals(component.getVersion(validated_only=True), valid_version)
-      self._component_tool.reset()
+      self._component_tool.reset(force=True, reset_portal_type=True)
       self.assertModuleImportable(reference)
 
     ComponentTool.reset = assertResetCalled
@@ -1495,7 +1495,7 @@ class _TestZodbComponent(SecurityTestCase):
       self.assertTrue(error_list[0].startswith(error_message))
       self.assertEquals(component.getTextContent(), invalid_code)
       self.assertEquals(component.getTextContent(validated_only=True), valid_code)
-      self._component_tool.reset()
+      self._component_tool.reset(force=True, reset_portal_type=True)
       self.assertModuleImportable('TestComponentWithSyntaxError')
 
     ComponentTool.reset = assertResetCalled
@@ -1780,7 +1780,7 @@ class TestPortalType(Person):
     self.assertFalse(self._module.TestPortalType in person.__class__.mro())
 
     # Reset Portal Type classes to ghost to make sure that everything is reset
-    self._component_tool.reset()
+    self._component_tool.reset(force=True, reset_portal_type=True)
 
     # TestPortalType must be in available type class list
     self.assertTrue('TestPortalType' in person_type.getDocumentTypeList())
-- 
2.30.9