[Erp5-report] r36278 rafael - in /erp5/trunk/products/ERP5Type: Core/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jun 11 16:49:30 CEST 2010


Author: rafael
Date: Fri Jun 11 16:49:22 2010
New Revision: 36278

URL: http://svn.erp5.org?rev=36278&view=rev
Log:
Added support to use strings to upgradeObjectClass.

This change allows use python scripts to upgrade Object Class without write external methods for it. The from_class and to_class arguments can be used like followed:

 from_class="Products.ERP5Type.Document.Folder.Folder"
 to_class="Products.ERP5Type.Document.Category.Category"

or use previous behaviour:

 from_class = folder.__class__
 to_class = category.__class__



Modified:
    erp5/trunk/products/ERP5Type/Core/Folder.py
    erp5/trunk/products/ERP5Type/tests/testFolder.py

Modified: erp5/trunk/products/ERP5Type/Core/Folder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Core/Folder.py?rev=36278&r1=36277&r2=36278&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Core/Folder.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Core/Folder.py [utf8] Fri Jun 11 16:49:22 2010
@@ -1084,13 +1084,28 @@ class Folder(CopyContainer, CMFBTreeFold
   security.declareProtected( Permissions.ModifyPortalContent, 'upgradeObjectClass' )
   def upgradeObjectClass(self, test_before, from_class, to_class, test_after):
     """
-    upgrade the class of all objects inside this
-    particular folder
-     test_before and test_after have to be a method with one parameter.
-     migrations is a dictionnary of class, { from_class : to_class }
+    Upgrade the class of all objects inside this particular folder:
+      test_before and test_after have to be a method with one parameter.
+
+      from_class and to_class can be classes (o.__class___) or strings like:
+        'Products.ERP5Type.Document.Folder.Folder'
+     
     """
-    #LOG("upradeObjectClass: folder ",0,self.id)
+    #LOG("upgradeObjectClass: folder ", 0, self.id)
     test_list = []
+    def getClassFromString(a_klass):
+      from_module = '.'.join(a_klass.split('.')[:-1])
+      real_klass = a_klass.split('.')[-1]
+      # XXX It is possible that API Change for Python 2.6.
+      mod = __import__(from_module, globals(), locals(),  [real_klass])
+      return getattr(mod, real_klass)
+
+    if isinstance(from_class, type('')):
+      from_class = getClassFromString(from_class)
+
+    if isinstance(to_class, type('')):
+      to_class = getClassFromString(to_class)
+
     folder = self.getObject()
     for o in self.listFolderContents():
       # Make sure this sub object is not the same as object

Modified: erp5/trunk/products/ERP5Type/tests/testFolder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testFolder.py?rev=36278&r1=36277&r2=36278&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testFolder.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testFolder.py [utf8] Fri Jun 11 16:49:22 2010
@@ -221,7 +221,25 @@ class TestFolder(ERP5TypeTestCase, LogIn
       self.assertNotEquals(self.folder[subobject.getId()][obj.getId()].__class__, from_class)
       self.assertEquals([1, 1], result)
 
-
+    def test_upgradeObjectClassWithStrings(self):
+      """ Test if it changes Object Class """
+      type_list = ['Folder', 'Category' ]
+      self._setAllowedContentTypesForFolderType(type_list)
+      obj = self.folder.newContent(portal_type="Category")
+      from_class_as_string = 'Products.ERP5Type.Document.Category.Category'
+      to_class_as_string = 'Products.ERP5Type.Document.Folder.Folder'
+      from_class = obj.__class__
+      to_class = self.folder.__class__
+      createZODBPythonScript(self.getPortal().portal_skins.custom,
+                     "test_upgradeObject", 'x',
+                     'return [1]')
+      test_script = self.getPortal().portal_skins.custom.test_upgradeObject
+      result = self.folder.upgradeObjectClass(test_script, from_class_as_string,
+                                              to_class_as_string, test_script)
+      transaction.commit()
+      self.assertEquals(self.folder[obj.getId()].__class__, to_class)
+      self.assertNotEquals(self.folder[obj.getId()].__class__, from_class)
+      self.assertEquals([1], result)
 
 def test_suite():
   suite = unittest.TestSuite()




More information about the Erp5-report mailing list