def migrate_replies(context, in_reply_to, replies, depth=0, just_delete=0): # Recursive function to migrate all direct replies # of a comment. Returns True if there are no replies to # this comment left, and therefore the comment can be removed. if len(replies) == 0: return True workflow = context.portal_workflow oldchain = workflow.getChainForPortalType('Discussion Item') new_workflow = workflow.comment_review_workflow mt = getToolByName(self.context, 'portal_membership') if type(oldchain) == TupleType and len(oldchain) > 0: oldchain = oldchain[0] for reply in replies: # log indent = " " for i in range(depth): indent += " " log("%smigrate_reply: '%s'." % (indent, reply.title)) should_migrate = True if filter_callback and not filter_callback(reply): should_migrate = False if just_delete: should_migrate = False new_in_reply_to = None if should_migrate: # create a reply object comment = CommentFactory() comment.title = reply.Title() comment.text = reply.cooked_text comment.mime_type = 'text/html' comment.creator = reply.Creator() try: comment.author_username = reply.author_username except AttributeError: comment.author_username = reply.Creator() member = mt.getMemberById(comment.author_username) if member: comment.author_name = member.fullname if not comment.author_name: # In migrated site member.fullname = '' # while member.getProperty('fullname') has the # correct value if member: comment.author_name = member.getProperty( 'fullname' ) else: comment.author_name = comment.author_username try: comment.author_email = reply.email except AttributeError: comment.author_email = None comment.creation_date = DT2dt(reply.creation_date) comment.modification_date = DT2dt(reply.modification_date) comment.reply_to = in_reply_to if in_reply_to == 0: # Direct reply to a content object new_in_reply_to = conversation.addComment(comment) else: # Reply to another comment comment_to_reply_to = conversation.get(in_reply_to) replies = IReplies(comment_to_reply_to) new_in_reply_to = replies.addComment(comment) # migrate the review state old_status = workflow.getStatusOf(oldchain, reply) new_status = { 'action': None, 'actor': None, 'comment': 'Migrated workflow state', 'review_state': old_status and old_status.get( 'review_state', new_workflow.initial_state ) or 'published', 'time': DateTime() } workflow.setStatusOf('comment_review_workflow', comment, new_status) auto_transition = new_workflow._findAutomaticTransition( comment, new_workflow._getWorkflowStateOf(comment)) if auto_transition is not None: new_workflow._changeStateOf(comment, auto_transition) else: new_workflow.updateRoleMappingsFor(comment) comment.reindexObject(idxs=['allowedRolesAndUsers', 'review_state']) self.total_comments_migrated += 1 # migrate all talkbacks of the reply talkback = getattr(reply, 'talkback', None) no_replies_left = migrate_replies( context, new_in_reply_to, talkback.getReplies(), depth=depth + 1, just_delete=not should_migrate) if no_replies_left: # remove reply and talkback talkback.deleteReply(reply.id) obj = aq_parent(talkback) obj.talkback = None log("%sremove %s" % (indent, reply.id)) self.total_comments_deleted += 1 # Return True when all comments on a certain level have been # migrated. return True
def migrate_replies(context, in_reply_to, replies, depth=0, just_delete=0): # Recursive function to migrate all direct replies # of a comment. Returns True if there are no replies to # this comment left, and therefore the comment can be removed. if len(replies) == 0: return True workflow = context.portal_workflow oldchain = workflow.getChainForPortalType('Discussion Item') new_workflow = workflow.comment_review_workflow if type(oldchain) == TupleType and len(oldchain) > 0: oldchain = oldchain[0] for reply in replies: # log indent = " " for i in range(depth): indent += " " log("%smigrate_reply: '%s'." % (indent, reply.title)) should_migrate = True if filter_callback and not filter_callback(reply): should_migrate = False if just_delete: should_migrate = False new_in_reply_to = None if should_migrate: # create a reply object comment = CommentFactory() comment.title = reply.Title() comment.text = reply.cooked_text comment.mime_type = 'text/html' comment.creator = reply.Creator() email = reply.getProperty('email', None) if email: comment.author_email = email comment.creation_date = DT2dt(reply.creation_date) comment.modification_date = DT2dt(reply.modification_date) comment.reply_to = in_reply_to if in_reply_to == 0: # Direct reply to a content object new_in_reply_to = conversation.addComment(comment) else: # Reply to another comment comment_to_reply_to = conversation.get(in_reply_to) replies = IReplies(comment_to_reply_to) new_in_reply_to = replies.addComment(comment) # migrate the review state old_status = workflow.getStatusOf(oldchain, reply) new_status = { 'action': None, 'actor': None, 'comment': 'Migrated workflow state', 'review_state': old_status and old_status.get( 'review_state', new_workflow.initial_state) or 'published', 'time': DateTime() } workflow.setStatusOf('comment_review_workflow', comment, new_status) auto_transition = new_workflow._findAutomaticTransition( comment, new_workflow._getWorkflowStateOf(comment)) if auto_transition is not None: new_workflow._changeStateOf(comment, auto_transition) else: new_workflow.updateRoleMappingsFor(comment) comment.reindexObject( idxs=['allowedRolesAndUsers', 'review_state']) self.total_comments_migrated += 1 # migrate all talkbacks of the reply talkback = getattr(reply, 'talkback', None) no_replies_left = migrate_replies( context, new_in_reply_to, talkback.getReplies(), depth=depth + 1, just_delete=not should_migrate) if no_replies_left: # remove reply and talkback talkback.deleteReply(reply.id) obj = aq_parent(talkback) obj.talkback = None log("%sremove %s" % (indent, reply.id)) self.total_comments_deleted += 1 # Return True when all comments on a certain level have been # migrated. return True
def migrate_replies(context, in_reply_to, replies, depth=0, just_delete=0): # Recursive function to migrate all direct replies # of a comment. Returns True if there are no replies to # this comment left, and therefore the comment can be removed. if len(replies) == 0: return True for reply in replies: # log indent = " " for i in range(depth): indent += " " log("%smigrate_reply: '%s'." % (indent, reply.title)) should_migrate = True if filter_callback and not filter_callback(reply): should_migrate = False if just_delete: should_migrate = False new_in_reply_to = None if should_migrate: # create a reply object comment = CommentFactory() comment.title = reply.Title() comment.text = reply.cooked_text comment.mime_type = 'text/html' comment.creator = reply.Creator() email = reply.getProperty('email', None) if email: comment.author_email = email comment.creation_date = DT2dt(reply.creation_date) comment.modification_date = DT2dt(reply.modification_date) comment.reply_to = in_reply_to if in_reply_to == 0: # Direct reply to a content object new_in_reply_to = conversation.addComment(comment) else: # Reply to another comment comment_to_reply_to = conversation.get(in_reply_to) replies = IReplies(comment_to_reply_to) try: comment.text.encode("utf-8") new_in_reply_to = replies.addComment(comment) except UnicodeDecodeError, e: log("Fixing UnicodeDecodeError %s" % e) comment.text = comment.text.decode("utf-8") new_in_reply_to = replies.addComment(comment) total_comments_migrated[0] += 1 # migrate all talkbacks of the reply talkback = getattr( reply, 'talkback', None) no_replies_left = migrate_replies(context, new_in_reply_to, talkback.getReplies(), depth=depth+1, just_delete=not should_migrate) if no_replies_left: # remove reply and talkback talkback.deleteReply(reply.id) obj = aq_parent(talkback) obj.talkback = None log("%sremove %s" % (indent, reply.id)) total_comments_deleted[0] += 1