From 7c156abf8d504029a948e0ed3a3ecd898453923e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Mon, 15 Jun 2009 15:10:31 +0000
Subject: [PATCH] XMLMatrix.py:  * call _delObject before changing the id of
 the object we are deleting in  setCellRange (similar to r26610)

tests/testXMLMatrix.py:
 * creates cells in the test before testing setCellRange, to make sure that it
 works with existing cells.
 * use LogInterceptor to make sure there are no error logged. This shows that
 we get duplicate uids if we don't have portal_activities, but i'm not sure
 this is a real problem, is ERP5 supposed to work without portal_activities ?



git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@27576 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/XMLMatrix.py           |  9 ++--
 product/ERP5Type/tests/testXMLMatrix.py | 62 ++++++++++++++++++++++++-
 2 files changed, 65 insertions(+), 6 deletions(-)

diff --git a/product/ERP5Type/XMLMatrix.py b/product/ERP5Type/XMLMatrix.py
index d5604db064..3eae44e1ed 100644
--- a/product/ERP5Type/XMLMatrix.py
+++ b/product/ERP5Type/XMLMatrix.py
@@ -231,10 +231,9 @@ class XMLMatrix(Folder):
       for object_id in object_id_list:
         new_name = 'temp_' + object_id
         obj = self._getOb(object_id)
-        obj.isIndexable = 0 # Disable reindexing while moving cells
+        self._delObject(object_id)
         obj.id = new_name
         self._setObject(new_name, aq_base(obj))
-        self._delObject(object_id)
 
       # Rename all cells to their final name.
       for object_id in object_id_list:
@@ -270,13 +269,13 @@ class XMLMatrix(Folder):
 
         if not to_delete and not (None in object_place):
           o = self._getOb('temp_' + object_id)
+          self._delObject('temp_' + object_id) # In all cases, we have
+                                               # to remove the temp object
           new_name = base_id + '_' + join(object_place,'_')
           o.id = new_name
           new_object_id_list.extend(new_name)
           self._setObject(new_name, aq_base(o))
-          self._delObject('temp_' + object_id) # In all cases, we have
-                                               # to remove the temp object
-          o.isIndexable = 1 # reindexing is possible again
+
           if new_name != object_id:
             # Theses two lines are very important, if the object is renamed
             # then we must uncatalog the previous one
diff --git a/product/ERP5Type/tests/testXMLMatrix.py b/product/ERP5Type/tests/testXMLMatrix.py
index 6eab0fba7b..c0e80eb80b 100644
--- a/product/ERP5Type/tests/testXMLMatrix.py
+++ b/product/ERP5Type/tests/testXMLMatrix.py
@@ -31,8 +31,10 @@ import unittest
 
 from Testing import ZopeTestCase
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.CMFCore.tests.base.testcase import LogInterceptor
 from Products.ERP5Type.Utils import cartesianProduct
 from AccessControl.SecurityManagement import newSecurityManager
+from zLOG import PROBLEM
 
 try:
   from transaction import get as get_transaction
@@ -40,7 +42,7 @@ except ImportError:
   pass
 
 
-class TestXMLMatrix(ERP5TypeTestCase):
+class TestXMLMatrix(ERP5TypeTestCase, LogInterceptor):
   """
   Tests the Cell API
   """
@@ -70,6 +72,11 @@ class TestXMLMatrix(ERP5TypeTestCase):
     module = portal.purchase_order_module
     if '1' not in module.objectIds():
       order = module.newContent(id='1', portal_type='Purchase Order')
+    self._catch_log_errors(ignored_level=PROBLEM)
+
+  def beforeTearDown(self):
+    self._ignore_log_errors()
+
 
   def test_01_RenameCellRange(self, quiet=quiet):
     """
@@ -260,6 +267,59 @@ class TestXMLMatrix(ERP5TypeTestCase):
       cell_path = url + '/' + id
       self.assertEquals(catalog.hasPath(cell_path),False)
 
+    # create some cells
+    cell1 = matrix.newCell(*['0', 'a'], **kwd)
+    cell1_path = cell1.getPath()
+    cell2 = matrix.newCell(*['1', 'a'], **kwd)
+    cell2_path = cell2.getPath()
+    get_transaction().commit()
+
+    # if we keep the same range, nothing happens
+    matrix.setCellRange(*cell_range, **kwd)
+    get_transaction().commit()
+    self.assertEqual(matrix.getCellRange(**kwd), cell_range)
+    self.assertEqual(len(matrix.getCellValueList(**kwd)), 2)
+    self.tic()
+
+    self.assertTrue(catalog.hasPath(matrix.getPath()))
+    self.assertTrue(catalog.hasPath(cell1_path))
+    self.assertTrue(catalog.hasPath(cell2_path))
+  
+    # now set other ranges
+    cell_range = [['0', '2'], ['a', ], ['Z']]
+    matrix.setCellRange(*cell_range, **kwd)
+    get_transaction().commit()
+    self.assertEqual(matrix.getCellRange(**kwd), cell_range)
+    self.tic()
+
+    # in this case, cells has been removed
+    self.assertEqual(matrix.getCellValueList(**kwd), [])
+
+    self.assertTrue(catalog.hasPath(matrix.getPath()))
+    self.assertFalse(catalog.hasPath(cell1_path))
+    self.assertFalse(catalog.hasPath(cell2_path))
+    
+    # create cells in this new range
+    cell1 = matrix.newCell(*['0', 'a', 'Z'], **kwd)
+    cell1_path = cell1.getPath()
+    cell2 = matrix.newCell(*['2', 'a', 'Z'], **kwd)
+    cell2_path = cell2.getPath()
+    get_transaction().commit()
+
+    cell_range = [['1', '2'], ['a', ], ['X']]
+    matrix.setCellRange(*cell_range, **kwd)
+    get_transaction().commit()
+    self.assertEqual(matrix.getCellRange(**kwd), cell_range)
+    self.tic()
+
+    # in this case, cells has been removed
+    self.assertEqual(matrix.getCellValueList(**kwd), [])
+
+    self.assertTrue(catalog.hasPath(matrix.getPath()))
+    self.assertFalse(catalog.hasPath(cell1_path))
+    self.assertFalse(catalog.hasPath(cell2_path))
+
+
   def test_02_SetCellRangeAndCatalogWithActivities(self, quiet=quiet):
     """
     Tests if set Cell range do well catalog and uncatalog, using activities
-- 
2.30.9