[Testbot] Plone 5.0 - Python 2.7 - Build # 1497 - Regression! - 3 failure(s)

jenkins at plone.org jenkins at plone.org
Wed Feb 12 13:57:07 UTC 2014


-------------------------------------------------------------------------------
Plone 5.0 - Python 2.7 - Build # 1497 - Still Failing!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-5.0-python-2.7/1497/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: plone.app.contenttypes
Branch: refs/heads/master
Date: 2014-02-11T03:19:19-08:00
Author: Philip Bauer (pbauer) <bauer at starzel.de>
Commit: https://github.com/plone/plone.app.contenttypes/commit/29f2e4b9a3e973b65451ee2a05c153cdfcb4a5bf

add failing test to confirm that the ModificationDate is changed on migration when content of folders is migrated (also when the folders containing the content is migrated)

Files changed:
M plone/app/contenttypes/tests/test_migration.py

diff --git a/plone/app/contenttypes/tests/test_migration.py b/plone/app/contenttypes/tests/test_migration.py
index 705726c..2a36998 100644
--- a/plone/app/contenttypes/tests/test_migration.py
+++ b/plone/app/contenttypes/tests/test_migration.py
@@ -13,6 +13,7 @@
 from zope.schema.interfaces import IVocabularyFactory
 
 import os.path
+import time
 import unittest2 as unittest
 
 
@@ -778,6 +779,70 @@ def test_blob_newsitem_content_is_migrated(self):
         self.assertEqual(dx_newsitem.text.mimeType,
                          'chemical/x-gaussian-checkpoint')
 
+    def test_modifield_date_is_unchanged(self):
+        from plone.app.contenttypes.migration.migration import (
+            restoreReferences,
+            migrate_documents,
+            migrate_folders
+        )
+
+        # IIntIds is not registered in the test env. So register it here
+        sm = getSiteManager(self.portal)
+        addUtility(sm, IIntIds, IntIds, ofs_name='intids', findroot=False)
+
+        # create folders
+        self.portal.invokeFactory('Folder', 'folder1')
+        at_folder1 = self.portal['folder1']
+        self.portal.invokeFactory('Folder', 'folder2')
+        at_folder2 = self.portal['folder2']
+        self.portal.invokeFactory('Folder', 'folder3')
+        at_folder3 = self.portal['folder3']
+
+        # create ATDocuments
+        at_folder1.invokeFactory('Document', 'doc1')
+        at_doc1 = at_folder1['doc1']
+        at_folder2.invokeFactory('Document', 'doc2')
+        at_doc2 = at_folder2['doc2']
+        self.portal.invokeFactory('Document', 'doc3')
+        at_doc3 = self.portal['doc3']
+        at_folder1.invokeFactory('News Item', 'newsitem')
+        # at_newsitem = at_folder1['newsitem']
+
+        time.sleep(0.1)
+
+        # relate them
+        #at_doc1.setRelatedItems([at_doc2])
+        #at_doc2.setRelatedItems([at_newsitem, at_doc3, at_doc1])
+        #at_doc3.setRelatedItems(at_doc1)
+        #at_folder1.setRelatedItems([at_doc2])
+        #at_folder2.setRelatedItems([at_doc1])
+
+        # migrate content
+        applyProfile(self.portal, 'plone.app.contenttypes:default')
+        migrate_folders(self.portal)
+        migrate_documents(self.portal)
+        dx_folder1 = self.portal['folder1']
+        dx_folder2 = self.portal['folder2']
+        dx_folder3 = self.portal['folder3']
+
+        dx_doc1 = dx_folder1['doc1']
+        dx_doc2 = dx_folder2['doc2']
+        dx_doc3 = self.portal['doc3']
+
+        # migrate references
+        #restoreReferences(self.portal)
+
+        self.assertTrue(at_folder1 is not dx_folder1)
+        self.assertTrue(at_folder2 is not dx_folder2)
+
+        # assert ModificationDates
+        self.assertNotEqual(at_folder1.ModificationDate(), dx_folder1.ModificationDate())
+        self.assertNotEqual(at_folder2.ModificationDate(), dx_folder2.ModificationDate())
+        self.assertEqual(at_folder3.ModificationDate(), dx_folder3.ModificationDate())
+        self.assertEqual(at_doc1.ModificationDate(), dx_doc1.ModificationDate())
+        self.assertEqual(at_doc2.ModificationDate(), dx_doc2.ModificationDate())
+        self.assertEqual(at_doc3.ModificationDate(), dx_doc3.ModificationDate())
+
     def test_folder_is_migrated(self):
         from plone.app.contenttypes.migration.migration import FolderMigrator
         from plone.app.contenttypes.interfaces import IFolder


Repository: plone.app.contenttypes
Branch: refs/heads/master
Date: 2014-02-11T05:31:12-08:00
Author: Philip Bauer (pbauer) <bauer at starzel.de>
Commit: https://github.com/plone/plone.app.contenttypes/commit/81f39eee08c40c7b02c5b7ccc6a9470d3d3281c4

add convenience-method to add the browser-layer to the request

Files changed:
M plone/app/contenttypes/testing.py

diff --git a/plone/app/contenttypes/testing.py b/plone/app/contenttypes/testing.py
index 1fee5f6..a09d27b 100644
--- a/plone/app/contenttypes/testing.py
+++ b/plone/app/contenttypes/testing.py
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+from plone.app.contenttypes.interfaces import IPloneAppContenttypesLayer
 from plone.app.event.testing import PAEvent_FIXTURE
 from plone.app.testing import PloneSandboxLayer
 from plone.app.testing import applyProfile
@@ -10,10 +11,20 @@
 from plone.app.testing import login
 from plone.testing import z2
 from zope.configuration import xmlconfig
+from zope.interface import alsoProvides
 
 import pkg_resources
 
 
+def set_browserlayer(request):
+    """Set the BrowserLayer for the request.
+
+    We have to set the browserlayer manually, since importing the profile alone
+    doesn't do it in tests.
+    """
+    alsoProvides(request, IPloneAppContenttypesLayer)
+
+
 class PloneAppContenttypes(PloneSandboxLayer):
 
     defaultBases = (PAEvent_FIXTURE, PLONE_FIXTURE,)


Repository: plone.app.contenttypes
Branch: refs/heads/master
Date: 2014-02-11T05:33:45-08:00
Author: Philip Bauer (pbauer) <bauer at starzel.de>
Commit: https://github.com/plone/plone.app.contenttypes/commit/037531b15797233f4a776dece15ea0d5018ca08f

Fix #62: Keep ModificationDate during migration.

Files changed:
M CHANGES.rst
M plone/app/contenttypes/migration/browser.py
M plone/app/contenttypes/tests/test_migration.py

diff --git a/CHANGES.rst b/CHANGES.rst
index 293b4ab..745444a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,9 @@ Changelog
 1.1a2 (unreleased)
 ------------------
 
+- Fix #62: Keep ModificationDate during migration.
+  [pbauer]
+
 - Only attempt transforming files if valid content type
   [vangheem]
 
diff --git a/plone/app/contenttypes/migration/browser.py b/plone/app/contenttypes/migration/browser.py
index 7c67e2d..882967e 100644
--- a/plone/app/contenttypes/migration/browser.py
+++ b/plone/app/contenttypes/migration/browser.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from Products.CMFCore.interfaces import IPropertiesTool
 from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.DublinCore import DefaultDublinCoreImpl
 from Products.Five.browser import BrowserView
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from datetime import datetime
@@ -98,6 +99,12 @@ def __call__(self,
         site_props = getattr(ptool, 'site_properties', None)
         link_integrity = site_props.getProperty('enable_link_integrity_checks',
                                                 False)
+
+        # patch notifyModified to prevent setModificationDate()
+        old_notifyModified = DefaultDublinCoreImpl.notifyModified
+        patched_notifyModified = lambda *args: None
+        DefaultDublinCoreImpl.notifyModified = patched_notifyModified
+
         site_props.manage_changeProperties(enable_link_integrity_checks=False)
 
         not_migrated = []
@@ -124,6 +131,9 @@ def __call__(self,
         site_props.manage_changeProperties(
             enable_link_integrity_checks=link_integrity
         )
+
+        DefaultDublinCoreImpl.notifyModified = old_notifyModified
+
         endtime = datetime.now()
         duration = (endtime - starttime).seconds
         if not from_form:
diff --git a/plone/app/contenttypes/tests/test_migration.py b/plone/app/contenttypes/tests/test_migration.py
index 2a36998..d675070 100644
--- a/plone/app/contenttypes/tests/test_migration.py
+++ b/plone/app/contenttypes/tests/test_migration.py
@@ -4,9 +4,11 @@
 from five.intid.site import addUtility
 from plone.app.contenttypes.testing import \
     PLONE_APP_CONTENTTYPES_MIGRATION_TESTING
+from plone.app.contenttypes.testing import set_browserlayer
 from plone.event.interfaces import IEventAccessor
 from plone.app.testing import login
 from plone.app.testing import applyProfile
+from zope.component import getMultiAdapter
 from zope.component import getSiteManager
 from zope.component import getUtility
 from zope.intid.interfaces import IIntIds
@@ -780,11 +782,7 @@ def test_blob_newsitem_content_is_migrated(self):
                          'chemical/x-gaussian-checkpoint')
 
     def test_modifield_date_is_unchanged(self):
-        from plone.app.contenttypes.migration.migration import (
-            restoreReferences,
-            migrate_documents,
-            migrate_folders
-        )
+        set_browserlayer(self.request)
 
         # IIntIds is not registered in the test env. So register it here
         sm = getSiteManager(self.portal)
@@ -806,21 +804,34 @@ def test_modifield_date_is_unchanged(self):
         self.portal.invokeFactory('Document', 'doc3')
         at_doc3 = self.portal['doc3']
         at_folder1.invokeFactory('News Item', 'newsitem')
-        # at_newsitem = at_folder1['newsitem']
+        at_newsitem = at_folder1['newsitem']
 
+        # be 100% sure the migration-date is after the creation-date
         time.sleep(0.1)
 
         # relate them
-        #at_doc1.setRelatedItems([at_doc2])
-        #at_doc2.setRelatedItems([at_newsitem, at_doc3, at_doc1])
-        #at_doc3.setRelatedItems(at_doc1)
-        #at_folder1.setRelatedItems([at_doc2])
-        #at_folder2.setRelatedItems([at_doc1])
+        at_doc1.setRelatedItems([at_doc2])
+        at_doc2.setRelatedItems([at_newsitem, at_doc3, at_doc1])
+        at_doc3.setRelatedItems(at_doc1)
+        at_folder1.setRelatedItems([at_doc2])
+        at_folder2.setRelatedItems([at_doc1])
 
         # migrate content
         applyProfile(self.portal, 'plone.app.contenttypes:default')
-        migrate_folders(self.portal)
-        migrate_documents(self.portal)
+
+        # we use the migration-view instead of calling the migratons by hand
+        # to make sure the patch for notifyModified is used.
+        migration_view = getMultiAdapter(
+            (self.portal, self.request),
+            name=u'migrate_from_atct'
+        )
+        migration_view(
+            content_types=['Document', 'Folder'],
+            migrate_schemaextended_content=True,
+            migrate_references=True,
+            from_form=False,
+        )
+
         dx_folder1 = self.portal['folder1']
         dx_folder2 = self.portal['folder2']
         dx_folder3 = self.portal['folder3']
@@ -829,19 +840,51 @@ def test_modifield_date_is_unchanged(self):
         dx_doc2 = dx_folder2['doc2']
         dx_doc3 = self.portal['doc3']
 
-        # migrate references
-        #restoreReferences(self.portal)
-
         self.assertTrue(at_folder1 is not dx_folder1)
         self.assertTrue(at_folder2 is not dx_folder2)
 
         # assert ModificationDates
-        self.assertNotEqual(at_folder1.ModificationDate(), dx_folder1.ModificationDate())
-        self.assertNotEqual(at_folder2.ModificationDate(), dx_folder2.ModificationDate())
-        self.assertEqual(at_folder3.ModificationDate(), dx_folder3.ModificationDate())
-        self.assertEqual(at_doc1.ModificationDate(), dx_doc1.ModificationDate())
-        self.assertEqual(at_doc2.ModificationDate(), dx_doc2.ModificationDate())
-        self.assertEqual(at_doc3.ModificationDate(), dx_doc3.ModificationDate())
+        self.assertEqual(
+            at_folder1.ModificationDate(),
+            dx_folder1.ModificationDate()
+        )
+        self.assertEqual(
+            at_folder2.ModificationDate(),
+            dx_folder2.ModificationDate()
+        )
+        self.assertEqual(
+            at_folder3.ModificationDate(),
+            dx_folder3.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc1.ModificationDate(),
+            dx_doc1.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc2.ModificationDate(),
+            dx_doc2.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc3.ModificationDate(),
+            dx_doc3.ModificationDate()
+        )
+
+        # assert single references
+        dx_doc1_related = [x.to_object for x in dx_doc1.relatedItems]
+        self.assertEqual(dx_doc1_related, [dx_doc2])
+
+        dx_doc3_related = [x.to_object for x in dx_doc3.relatedItems]
+        self.assertEqual(dx_doc3_related, [dx_doc1])
+
+        dx_folder1_related = [x.to_object for x in dx_folder1.relatedItems]
+        self.assertEqual(dx_folder1_related, [dx_doc2])
+
+        dx_folder2_related = [x.to_object for x in dx_folder2.relatedItems]
+        self.assertEqual(dx_folder2_related, [dx_doc1])
+
+        # assert multi references, order is restored
+        dx_doc2_related = [x.to_object for x in dx_doc2.relatedItems]
+        self.assertEqual(dx_doc2_related, [at_newsitem, dx_doc3, dx_doc1])
 
     def test_folder_is_migrated(self):
         from plone.app.contenttypes.migration.migration import FolderMigrator


Repository: plone.app.contenttypes
Branch: refs/heads/master
Date: 2014-02-12T05:12:46-08:00
Author: Philip Bauer (pbauer) <bauer at starzel.de>
Commit: https://github.com/plone/plone.app.contenttypes/commit/eeaedfc8853a6821246826f158a19e56a6f394d9

Merge pull request #114 from plone/#62_modification_date_changed

fix #62 modification date changed

Files changed:
M CHANGES.rst
M plone/app/contenttypes/migration/browser.py
M plone/app/contenttypes/testing.py
M plone/app/contenttypes/tests/test_migration.py

diff --git a/CHANGES.rst b/CHANGES.rst
index 293b4ab..745444a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,9 @@ Changelog
 1.1a2 (unreleased)
 ------------------
 
+- Fix #62: Keep ModificationDate during migration.
+  [pbauer]
+
 - Only attempt transforming files if valid content type
   [vangheem]
 
diff --git a/plone/app/contenttypes/migration/browser.py b/plone/app/contenttypes/migration/browser.py
index ff24c4e..9323193 100644
--- a/plone/app/contenttypes/migration/browser.py
+++ b/plone/app/contenttypes/migration/browser.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from Products.CMFCore.interfaces import IPropertiesTool
 from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.DublinCore import DefaultDublinCoreImpl
 from Products.Five.browser import BrowserView
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from datetime import datetime
@@ -98,6 +99,12 @@ def __call__(self,
         site_props = getattr(ptool, 'site_properties', None)
         link_integrity = site_props.getProperty('enable_link_integrity_checks',
                                                 False)
+
+        # patch notifyModified to prevent setModificationDate()
+        old_notifyModified = DefaultDublinCoreImpl.notifyModified
+        patched_notifyModified = lambda *args: None
+        DefaultDublinCoreImpl.notifyModified = patched_notifyModified
+
         site_props.manage_changeProperties(enable_link_integrity_checks=False)
 
         not_migrated = []
@@ -124,6 +131,9 @@ def __call__(self,
         site_props.manage_changeProperties(
             enable_link_integrity_checks=link_integrity
         )
+
+        DefaultDublinCoreImpl.notifyModified = old_notifyModified
+
         endtime = datetime.now()
         duration = (endtime - starttime).seconds
         if not from_form:
diff --git a/plone/app/contenttypes/testing.py b/plone/app/contenttypes/testing.py
index 1fee5f6..a09d27b 100644
--- a/plone/app/contenttypes/testing.py
+++ b/plone/app/contenttypes/testing.py
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+from plone.app.contenttypes.interfaces import IPloneAppContenttypesLayer
 from plone.app.event.testing import PAEvent_FIXTURE
 from plone.app.testing import PloneSandboxLayer
 from plone.app.testing import applyProfile
@@ -10,10 +11,20 @@
 from plone.app.testing import login
 from plone.testing import z2
 from zope.configuration import xmlconfig
+from zope.interface import alsoProvides
 
 import pkg_resources
 
 
+def set_browserlayer(request):
+    """Set the BrowserLayer for the request.
+
+    We have to set the browserlayer manually, since importing the profile alone
+    doesn't do it in tests.
+    """
+    alsoProvides(request, IPloneAppContenttypesLayer)
+
+
 class PloneAppContenttypes(PloneSandboxLayer):
 
     defaultBases = (PAEvent_FIXTURE, PLONE_FIXTURE,)
diff --git a/plone/app/contenttypes/tests/test_migration.py b/plone/app/contenttypes/tests/test_migration.py
index 705726c..d675070 100644
--- a/plone/app/contenttypes/tests/test_migration.py
+++ b/plone/app/contenttypes/tests/test_migration.py
@@ -4,15 +4,18 @@
 from five.intid.site import addUtility
 from plone.app.contenttypes.testing import \
     PLONE_APP_CONTENTTYPES_MIGRATION_TESTING
+from plone.app.contenttypes.testing import set_browserlayer
 from plone.event.interfaces import IEventAccessor
 from plone.app.testing import login
 from plone.app.testing import applyProfile
+from zope.component import getMultiAdapter
 from zope.component import getSiteManager
 from zope.component import getUtility
 from zope.intid.interfaces import IIntIds
 from zope.schema.interfaces import IVocabularyFactory
 
 import os.path
+import time
 import unittest2 as unittest
 
 
@@ -778,6 +781,111 @@ def test_blob_newsitem_content_is_migrated(self):
         self.assertEqual(dx_newsitem.text.mimeType,
                          'chemical/x-gaussian-checkpoint')
 
+    def test_modifield_date_is_unchanged(self):
+        set_browserlayer(self.request)
+
+        # IIntIds is not registered in the test env. So register it here
+        sm = getSiteManager(self.portal)
+        addUtility(sm, IIntIds, IntIds, ofs_name='intids', findroot=False)
+
+        # create folders
+        self.portal.invokeFactory('Folder', 'folder1')
+        at_folder1 = self.portal['folder1']
+        self.portal.invokeFactory('Folder', 'folder2')
+        at_folder2 = self.portal['folder2']
+        self.portal.invokeFactory('Folder', 'folder3')
+        at_folder3 = self.portal['folder3']
+
+        # create ATDocuments
+        at_folder1.invokeFactory('Document', 'doc1')
+        at_doc1 = at_folder1['doc1']
+        at_folder2.invokeFactory('Document', 'doc2')
+        at_doc2 = at_folder2['doc2']
+        self.portal.invokeFactory('Document', 'doc3')
+        at_doc3 = self.portal['doc3']
+        at_folder1.invokeFactory('News Item', 'newsitem')
+        at_newsitem = at_folder1['newsitem']
+
+        # be 100% sure the migration-date is after the creation-date
+        time.sleep(0.1)
+
+        # relate them
+        at_doc1.setRelatedItems([at_doc2])
+        at_doc2.setRelatedItems([at_newsitem, at_doc3, at_doc1])
+        at_doc3.setRelatedItems(at_doc1)
+        at_folder1.setRelatedItems([at_doc2])
+        at_folder2.setRelatedItems([at_doc1])
+
+        # migrate content
+        applyProfile(self.portal, 'plone.app.contenttypes:default')
+
+        # we use the migration-view instead of calling the migratons by hand
+        # to make sure the patch for notifyModified is used.
+        migration_view = getMultiAdapter(
+            (self.portal, self.request),
+            name=u'migrate_from_atct'
+        )
+        migration_view(
+            content_types=['Document', 'Folder'],
+            migrate_schemaextended_content=True,
+            migrate_references=True,
+            from_form=False,
+        )
+
+        dx_folder1 = self.portal['folder1']
+        dx_folder2 = self.portal['folder2']
+        dx_folder3 = self.portal['folder3']
+
+        dx_doc1 = dx_folder1['doc1']
+        dx_doc2 = dx_folder2['doc2']
+        dx_doc3 = self.portal['doc3']
+
+        self.assertTrue(at_folder1 is not dx_folder1)
+        self.assertTrue(at_folder2 is not dx_folder2)
+
+        # assert ModificationDates
+        self.assertEqual(
+            at_folder1.ModificationDate(),
+            dx_folder1.ModificationDate()
+        )
+        self.assertEqual(
+            at_folder2.ModificationDate(),
+            dx_folder2.ModificationDate()
+        )
+        self.assertEqual(
+            at_folder3.ModificationDate(),
+            dx_folder3.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc1.ModificationDate(),
+            dx_doc1.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc2.ModificationDate(),
+            dx_doc2.ModificationDate()
+        )
+        self.assertEqual(
+            at_doc3.ModificationDate(),
+            dx_doc3.ModificationDate()
+        )
+
+        # assert single references
+        dx_doc1_related = [x.to_object for x in dx_doc1.relatedItems]
+        self.assertEqual(dx_doc1_related, [dx_doc2])
+
+        dx_doc3_related = [x.to_object for x in dx_doc3.relatedItems]
+        self.assertEqual(dx_doc3_related, [dx_doc1])
+
+        dx_folder1_related = [x.to_object for x in dx_folder1.relatedItems]
+        self.assertEqual(dx_folder1_related, [dx_doc2])
+
+        dx_folder2_related = [x.to_object for x in dx_folder2.relatedItems]
+        self.assertEqual(dx_folder2_related, [dx_doc1])
+
+        # assert multi references, order is restored
+        dx_doc2_related = [x.to_object for x in dx_doc2.relatedItems]
+        self.assertEqual(dx_doc2_related, [at_newsitem, dx_doc3, dx_doc1])
+
     def test_folder_is_migrated(self):
         from plone.app.contenttypes.migration.migration import FolderMigrator
         from plone.app.contenttypes.interfaces import IFolder




-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 21519 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140212/7e54cb7a/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 125510 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140212/7e54cb7a/attachment-0003.obj>


More information about the Testbot mailing list