From 74e72a4580ecb8e61d717232653bad71017a6ba3 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 24 Aug 2010 22:00:29 -0400 Subject: added fix_revisionless_posts management command --- .../management/commands/fix_revisionless_posts.py | 43 ++++++++++++++++++++++ askbot/models/answer.py | 19 +++++----- 2 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 askbot/management/commands/fix_revisionless_posts.py diff --git a/askbot/management/commands/fix_revisionless_posts.py b/askbot/management/commands/fix_revisionless_posts.py new file mode 100644 index 00000000..92c03425 --- /dev/null +++ b/askbot/management/commands/fix_revisionless_posts.py @@ -0,0 +1,43 @@ +"""this management commands will fix corrupted posts +that do not have revisions by creating a fake initial revision +based on the content stored in the post itself +""" +from django.core.management.base import NoArgsCommand +from django.db.models import signals, Count +from askbot import models +from askbot import const + +def fix_revisionless_posts(post_class, post_name): + posts = post_class.objects.annotate( + rev_count = Count('revisions') + ).filter(rev_count = 0) + print 'have %d corrupted %ss' % (len(posts), post_name) + for post in posts: + post.add_revision( + author = post.author, + text = post.text, + comment = const.POST_STATUS['default_version'], + revised_at = post.added_at + ) + post.last_edited_at = None + post.last_edited_by = None + post.save() + +class Command(NoArgsCommand): + """Command class for "fix_answer_counts" + """ + + def remove_save_signals(self): + """removes signals on model pre-save and + post-save, so that there are no side-effects + besides actually updating the answer counts + """ + signals.pre_save.receivers = [] + signals.post_save.receivers = [] + + def handle(self, *arguments, **options): + """function that handles the command job + """ + self.remove_save_signals() + fix_revisionless_posts(models.Question, 'question') + fix_revisionless_posts(models.Answer, 'answer') diff --git a/askbot/models/answer.py b/askbot/models/answer.py index 37f12e2f..9afab656 100644 --- a/askbot/models/answer.py +++ b/askbot/models/answer.py @@ -38,7 +38,7 @@ class AnswerManager(models.Manager): answer.parse_and_save(author = author) answer.add_revision( - revised_by = author, + author = author, revised_at = added_at, text = text, comment = const.POST_STATUS['default_version'], @@ -116,19 +116,20 @@ class Answer(content.Content, DeletableContent): self.parse_and_save(author = edited_by) self.add_revision( - revised_by=edited_by, - revised_at=edited_at, - text=text, - comment=comment + author = edited_by, + revised_at = edited_at, + text = text, + comment = comment ) self.question.last_activity_at = edited_at self.question.last_activity_by = edited_by self.question.save() - def add_revision(self, revised_by=None, revised_at=None, text=None, comment=None): - if None in (revised_by, revised_at, text): - raise Exception('arguments revised_by, revised_at and text are required') + def add_revision(self, author=None, revised_at=None, text=None, comment=None): + #todo: this may be identical to Question.add_revision + if None in (author, revised_at, text): + raise Exception('arguments author, revised_at and text are required') rev_no = self.revisions.all().count() + 1 if comment in (None, ''): if rev_no == 1: @@ -137,7 +138,7 @@ class Answer(content.Content, DeletableContent): comment = 'No.%s Revision' % rev_no return AnswerRevision.objects.create( answer=self, - author=revised_by, + author=author, revised_at=revised_at, text=text, summary=comment, -- cgit v1.2.3-1-g7c22