diff --git a/CHANGES.txt b/CHANGES.txt index 9db1d65..537c154 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,14 @@ Changelog 2.0b1 (Unreleased) ------------------ +- Fix issue where GMT datetimes were converted into local timezone DateTimes + during indexing. + [davisagli] + +- Handle timezones correctly while converting dates during the migration of + legacy comments. + [davisagli] + - When returning a comment's title, give preference to its title attribute if set. [davisagli] diff --git a/plone/app/discussion/browser/migration.py b/plone/app/discussion/browser/migration.py index 17ccc6c..44f7fff 100644 --- a/plone/app/discussion/browser/migration.py +++ b/plone/app/discussion/browser/migration.py @@ -15,6 +15,12 @@ from plone.app.discussion.comment import CommentFactory from plone.app.discussion.interfaces import IConversation, IReplies, IComment +def DT2dt(DT): + """Convert a Zope DateTime (with timezone) into a Python datetime (GMT).""" + DT = DT.toZone('GMT') + return datetime(DT.year(), DT.month(), DT.day(), DT.hour(), DT.minute(), int(DT.second())) + + class View(BrowserView): """Migration View """ @@ -78,10 +84,8 @@ class View(BrowserView): if email: comment.author_email = email - comment.creation_date = datetime.fromtimestamp( - reply.creation_date) - comment.modification_date = datetime.fromtimestamp( - reply.modification_date) + comment.creation_date = DT2dt(reply.creation_date) + comment.modification_date = DT2dt(reply.modification_date) comment.reply_to = in_reply_to diff --git a/plone/app/discussion/catalog.py b/plone/app/discussion/catalog.py index dd00943..13c48ae 100644 --- a/plone/app/discussion/catalog.py +++ b/plone/app/discussion/catalog.py @@ -100,7 +100,8 @@ def effective(object): object.creation_date.day, object.creation_date.hour, object.creation_date.minute, - object.creation_date.second) + object.creation_date.second, + 'GMT') @indexer(IComment) def created(object): @@ -110,7 +111,8 @@ def created(object): object.creation_date.day, object.creation_date.hour, object.creation_date.minute, - object.creation_date.second) + object.creation_date.second, + 'GMT') @indexer(IComment) def modified(object): @@ -120,7 +122,8 @@ def modified(object): object.modification_date.day, object.modification_date.hour, object.modification_date.minute, - object.modification_date.second) + object.modification_date.second, + 'GMT') # Override the conversation indexers for comments diff --git a/plone/app/discussion/tests/test_indexers.py b/plone/app/discussion/tests/test_indexers.py index 8fd3941..0b1166b 100644 --- a/plone/app/discussion/tests/test_indexers.py +++ b/plone/app/discussion/tests/test_indexers.py @@ -151,11 +151,11 @@ class CommentIndexersTest(PloneTestCase): def test_dates(self): # Test if created, modified, effective etc. are set correctly self.assertEquals(catalog.created(self.comment)(), - DateTime(2006, 9, 17, 14, 18, 12)) + DateTime(2006, 9, 17, 14, 18, 12, 'GMT')) self.assertEquals(catalog.effective(self.comment)(), - DateTime(2006, 9, 17, 14, 18, 12)) + DateTime(2006, 9, 17, 14, 18, 12, 'GMT')) self.assertEquals(catalog.modified(self.comment)(), - DateTime(2008, 3, 12, 7, 32, 52)) + DateTime(2008, 3, 12, 7, 32, 52, 'GMT')) def test_searchable_text(self): # Test if searchable text is a concatenation of title and comment text diff --git a/plone/app/discussion/tests/test_migration.py b/plone/app/discussion/tests/test_migration.py index 2bb32c9..b1b16ac 100644 --- a/plone/app/discussion/tests/test_migration.py +++ b/plone/app/discussion/tests/test_migration.py @@ -47,8 +47,8 @@ class MigrationTest(PloneTestCase): self.doc.talkback.createReply('My Title', 'My Text', Creator='Jim') reply = talkback.getReplies()[0] reply.setReplyTo(self.doc) - reply.creation_date = DateTime(2003, 3, 11, 9, 28, 6) - reply.modification_date = DateTime(2009, 7, 12, 19, 38, 7) + reply.creation_date = DateTime(2003, 3, 11, 9, 28, 6, 'GMT') + reply.modification_date = DateTime(2009, 7, 12, 19, 38, 7, 'GMT') self.assertEquals(reply.Title(), 'My Title') self.assertEquals(reply.EditableBody(), 'My Text') self.failUnless('Jim' in reply.listCreators())