plone.app.discussion/plone/app/discussion/browser/migration.py

97 lines
3.3 KiB
Python
Raw Normal View History

from datetime import datetime
from Acquisition import aq_inner, aq_parent
from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone import PloneMessageFactory as _
from Products.statusmessages.interfaces import IStatusMessage
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
class View(BrowserView):
"""Migration View
"""
def __call__(self):
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.creation_date = datetime.fromtimestamp(reply.creation_date)
comment.creation_date = datetime.fromtimestamp(reply.creation_date)
comment.modification_date = datetime.fromtimestamp(reply.modification_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
catalog = getToolByName(context, 'portal_catalog')
dtool = context.portal_discussion
brains = catalog.searchResults(
object_provides='Products.CMFCore.interfaces._content.IContentish')
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':
obj = brain.getObject()
talkback = getattr( obj, 'talkback', None )
if talkback:
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.")
log("%s of %s comments migrated."
% (self.total_comments_migrated, total_comment_brains))
return '\n'.join(out)