Skip to content

Commit

Permalink
Fix #62: Keep ModificationDate during migration.
Browse files Browse the repository at this point in the history
  • Loading branch information
pbauer committed Feb 11, 2014
1 parent 81f39ee commit 037531b
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 22 deletions.
3 changes: 3 additions & 0 deletions CHANGES.rst
Expand Up @@ -4,6 +4,9 @@ Changelog
1.1a2 (unreleased)
------------------

- Fix #62: Keep ModificationDate during migration.
[pbauer]

- Only attempt transforming files if valid content type
[vangheem]

Expand Down
10 changes: 10 additions & 0 deletions 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
Expand Down Expand Up @@ -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 = []
Expand All @@ -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:
Expand Down
87 changes: 65 additions & 22 deletions plone/app/contenttypes/tests/test_migration.py
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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']
Expand All @@ -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
Expand Down

0 comments on commit 037531b

Please sign in to comment.