summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-24 22:00:29 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-24 22:00:29 -0400
commit74e72a4580ecb8e61d717232653bad71017a6ba3 (patch)
tree7035846a6e6bb66233c1ec90bb41dddbd404e80a
parent41ccbb380e280361afb4acb657530ba1826c944b (diff)
downloadaskbot-74e72a4580ecb8e61d717232653bad71017a6ba3.tar.gz
askbot-74e72a4580ecb8e61d717232653bad71017a6ba3.tar.bz2
askbot-74e72a4580ecb8e61d717232653bad71017a6ba3.zip
added fix_revisionless_posts management command
-rw-r--r--askbot/management/commands/fix_revisionless_posts.py43
-rw-r--r--askbot/models/answer.py19
2 files changed, 53 insertions, 9 deletions
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,