[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