From 18ee5159bdf02c00c5e8859201d9386b861e6bdf Mon Sep 17 00:00:00 2001 From: Timo Stollenwerk Date: Sun, 12 Jul 2009 16:09:34 +0000 Subject: [PATCH] function to recursively migrate comments added. svn path=/plone.app.discussion/trunk/; revision=28016 --- plone/app/discussion/browser/migration.py | 65 ++++++++++++++------ plone/app/discussion/tests/test_migration.py | 40 +++++++----- 2 files changed, 73 insertions(+), 32 deletions(-) diff --git a/plone/app/discussion/browser/migration.py b/plone/app/discussion/browser/migration.py index dc41d77..5031654 100644 --- a/plone/app/discussion/browser/migration.py +++ b/plone/app/discussion/browser/migration.py @@ -13,6 +13,8 @@ from Products.CMFCore.interfaces import IContentish from zope.component import createObject +from plone.app.discussion.comment import CommentFactory + from plone.app.discussion.interfaces import IConversation @@ -24,10 +26,42 @@ class View(BrowserView): context = aq_inner(self.context) out = [] + self.total_comments_migrated = 0 + def log(msg): context.plone_log(msg) out.append(msg) + def migrate_replies(context, in_reply_to, replies, depth=0): + # recursive function to migrate all direct replies + # of a comment + + for reply in replies: + + # log + indent = " " + for i in range(depth): + indent += " " + log("%smigrate_reply: '%s'." % (indent, reply.title)) + + # create a reply object + comment = CommentFactory() + comment.title = reply.Title() + comment.text = reply.text + comment.creator = reply.Creator() + #comment.author_name = author_username + #comment.author_email = "" + #comment.creation_date + + comment.reply_to = in_reply_to + + new_in_reply_to = conversation.addComment(comment) + self.total_comments_migrated += 1 + + # migrate all talkbacks of the reply + talkback = getattr( reply, 'talkback', None ) + migrate_replies(context, new_in_reply_to, talkback.getReplies(), depth=depth+1) + log("Comment migration started.") # Find content @@ -35,29 +69,24 @@ class View(BrowserView): dtool = context.portal_discussion brains = catalog.searchResults( object_provides='Products.CMFCore.interfaces._content.IContentish') - log("Found %s content objects to migrate." % len(brains)) + comment_brains = catalog.searchResults(Type='Discussion Item') + total_comment_brains = len(comment_brains) + log("Found %s content objects." % len(brains)) + log("Found %s Discussion Item objects." % total_comment_brains) for brain in brains: if brain.portal_type != 'Discussion Item': - old_comments = [] obj = brain.getObject() talkback = getattr( obj, 'talkback', None ) if talkback: - replies = talkback.objectValues() - log("%s: Found talkback with %s comments to migrate"\ - % (obj.absolute_url(relative=1), len(replies))) - for reply in replies: - old_comments.append(reply) - - # Build up new conversation/comments structure - conversation = IConversation(obj) - - for old_comment in old_comments: - comment = createObject('plone.Comment') - comment.title = old_comment.Title() - comment.text = old_comment.text - comment.Creator = old_comment.Creator - conversation.addComment(comment) + replies = talkback.getReplies() + if replies: + conversation = IConversation(obj) + log("Create conversation for: '%s'" % obj.Title()) + log("%s: Found talkback" % obj.absolute_url(relative=1)) + migrate_replies(context, 0, replies) log("Comment migration finished.") - return out + log("%s of %s comments migrated." + % (self.total_comments_migrated, total_comment_brains)) + return '\n'.join(out) diff --git a/plone/app/discussion/tests/test_migration.py b/plone/app/discussion/tests/test_migration.py index 3e7abd0..6de1450 100644 --- a/plone/app/discussion/tests/test_migration.py +++ b/plone/app/discussion/tests/test_migration.py @@ -35,12 +35,16 @@ class MigrationTest(PloneTestCase): def test_migrate_comment(self): # Create one comment - self.discussion.getDiscussionFor(self.doc) + talkback = self.discussion.getDiscussionFor(self.doc) self.doc.talkback.createReply('My Title', 'My Text', Creator='Jim') - reply = self.doc.talkback.objectValues()[0] - self.assertEqual(reply.Title(), 'My Title') - self.assertEqual(reply.EditableBody(), 'My Text') + #reply = talkback.objectValues()[0] + reply = talkback.getReplies()[0] + reply.setReplyTo(self.doc) + self.assertEquals(reply.Title(), 'My Title') + self.assertEquals(reply.EditableBody(), 'My Text') self.failUnless('Jim' in reply.listCreators()) + self.assertEquals(talkback.replyCount(self.doc), 1) + self.assertEquals(reply.inReplyTo(), self.doc) # Call migration script self.view() @@ -53,10 +57,17 @@ class MigrationTest(PloneTestCase): # Check migration self.assertEquals(conversation.total_comments, 1) self.failUnless(conversation.getComments().next()) - self.assert_(IComment.providedBy(conversation.getComments().next())) - self.assertEquals(conversation.values()[0].Title(), 'My Title') - self.assertEquals(conversation.values()[0].text, 'My Text') - self.assertEquals(conversation.values()[0].Creator(), 'Jim') + comment1 = conversation.values()[0] + self.assert_(IComment.providedBy(comment1)) + self.assertEquals(comment1.Title(), 'My Title') + self.assertEquals(comment1.text, 'My Text') + self.assertEquals(comment1.Creator(), 'Jim') + self.assertEquals( + [{'comment': comment1, 'depth': 0, 'id': long(comment1.id)},] + , list(conversation.getThreads())) + + def test_migrate_allow_discussion(self): + pass def test_migrate_nested_comments(self): # Create some nested comments and migrate them @@ -89,13 +100,14 @@ class MigrationTest(PloneTestCase): # Check migration conversation = IConversation(self.doc) self.assertEquals(conversation.total_comments, 2) - self.assert_(IComment.providedBy(conversation.getComments().next())) - # XXX: This is not very elegant - self.failUnless('First comment' in conversation.values()[0].Title() or - 'Re: First comment' in conversation.values()[0].Title()) - self.failUnless('This is my first comment.' in conversation.values()[0].text or - 'This is my first reply.' in conversation.values()[1].text) + comment1 = conversation.values()[0] + comment2 = conversation.values()[1] + + self.assertEquals( + [{'comment': comment1, 'depth': 0, 'id': long(comment1.id)}, + {'comment': comment2, 'depth': 0, 'id': long(comment2.id)}, + ], list(conversation.getThreads())) def test_suite(): return unittest.defaultTestLoader.loadTestsFromName(__name__) \ No newline at end of file