Browse Source

Updated threads models to accommodate karma and correctly handle user deletion.

Ralfp 12 years ago
parent
commit
6d041f263e
1 changed files with 35 additions and 8 deletions
  1. 35 8
      misago/threads/models.py

+ 35 - 8
misago/threads/models.py

@@ -29,13 +29,13 @@ class Thread(models.Model):
     downvotes = models.PositiveIntegerField(default=0)
     start = models.DateTimeField(db_index=True)
     start_post = models.ForeignKey('Post', related_name='+', null=True, blank=True, on_delete=models.SET_NULL)
-    start_poster = models.ForeignKey('users.User', null=True, blank=True)
+    start_poster = models.ForeignKey('users.User', null=True, blank=True, on_delete=models.SET_NULL)
     start_poster_name = models.CharField(max_length=255)
     start_poster_slug = models.SlugField(max_length=255)
     start_poster_style = models.CharField(max_length=255, null=True, blank=True)
     last = models.DateTimeField(db_index=True)
     last_post = models.ForeignKey('Post', related_name='+', null=True, blank=True, on_delete=models.SET_NULL)
-    last_poster = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
+    last_poster = models.ForeignKey('users.User', related_name='+', null=True, blank=True, on_delete=models.SET_NULL)
     last_poster_name = models.CharField(max_length=255, null=True, blank=True)
     last_poster_slug = models.SlugField(max_length=255, null=True, blank=True)
     last_poster_style = models.CharField(max_length=255, null=True, blank=True)
@@ -123,7 +123,7 @@ class Post(models.Model):
     forum = models.ForeignKey('forums.Forum')
     thread = models.ForeignKey(Thread)
     merge = models.PositiveIntegerField(default=0, db_index=True)
-    user = models.ForeignKey('users.User', null=True, blank=True)
+    user = models.ForeignKey('users.User', null=True, blank=True, on_delete=models.SET_NULL)
     user_name = models.CharField(max_length=255)
     ip = models.GenericIPAddressField()
     agent = models.CharField(max_length=255)
@@ -137,7 +137,7 @@ class Post(models.Model):
     edits = models.PositiveIntegerField(default=0)
     edit_date = models.DateTimeField(null=True, blank=True)
     edit_reason = models.CharField(max_length=255, null=True, blank=True)
-    edit_user = models.ForeignKey('users.User', related_name='+', null=True)
+    edit_user = models.ForeignKey('users.User', related_name='+', null=True, blank=True, on_delete=models.SET_NULL)
     edit_user_name = models.CharField(max_length=255, null=True, blank=True)
     edit_user_slug = models.SlugField(max_length=255, null=True, blank=True)
     reported = models.BooleanField(default=False)
@@ -199,11 +199,24 @@ class Post(models.Model):
                     pass
 
 
+class Karma(models.Model):
+    forum = models.ForeignKey('forums.Forum')
+    thread = models.ForeignKey(Thread)
+    post = models.ForeignKey(Post)
+    user = models.ForeignKey('users.User', null=True, blank=True, on_delete=models.SET_NULL)
+    user_name = models.CharField(max_length=255)
+    user_slug = models.CharField(max_length=255)
+    date = models.DateTimeField()
+    ip = models.GenericIPAddressField()
+    agent = models.CharField(max_length=255)
+    score = models.IntegerField(default=0)
+    
+
 class Change(models.Model):
     forum = models.ForeignKey('forums.Forum')
     thread = models.ForeignKey(Thread)
     post = models.ForeignKey(Post)
-    user = models.ForeignKey('users.User', null=True, blank=True)
+    user = models.ForeignKey('users.User', null=True, blank=True, on_delete=models.SET_NULL)
     user_name = models.CharField(max_length=255)
     user_slug = models.CharField(max_length=255)
     date = models.DateTimeField()
@@ -222,7 +235,7 @@ class Checkpoint(models.Model):
     thread = models.ForeignKey(Thread)
     post = models.ForeignKey(Post)
     action = models.CharField(max_length=255)
-    user = models.ForeignKey('users.User', null=True, blank=True)
+    user = models.ForeignKey('users.User', null=True, blank=True, on_delete=models.SET_NULL)
     user_name = models.CharField(max_length=255)
     user_slug = models.CharField(max_length=255)
     date = models.DateTimeField()
@@ -249,6 +262,10 @@ def rename_user_handler(sender, **kwargs):
                                                  edit_user_name=sender.username,
                                                  edit_user_slug=sender.username_slug,
                                                  )
+    Karma.objects.filter(user=sender).update(
+                                             user_name=sender.username,
+                                             user_slug=sender.username_slug,
+                                             )
     Change.objects.filter(user=sender).update(
                                               user_name=sender.username,
                                               user_slug=sender.username_slug,
@@ -262,7 +279,8 @@ rename_user.connect(rename_user_handler, dispatch_uid="rename_user_threads")
 
 
 def delete_user_content_handler(sender, **kwargs):
-    Thread.objects.filter(start_poster=sender).delete()
+    for thread in Thread.objects.filter(start_poster=sender):
+        thread.delete()
     threads = []
     prev_posts = []
     for post in sender.post_set.filter(checkpoints=True):
@@ -276,7 +294,8 @@ def delete_user_content_handler(sender, **kwargs):
     for post in sender.post_set.distinct().values('thread_id').iterator():
         if not post['thread_id'] in threads:
             threads.append(post['thread_id'])
-    Post.objects.filter(user=sender).delete()
+    for post in Post.objects.filter(user=sender).delete():
+        post.delete()
     for thread in Thread.objects.filter(id__in=threads):
         thread.sync()
         thread.save(force_update=True)
@@ -287,6 +306,7 @@ delete_user_content.connect(delete_user_content_handler, dispatch_uid="delete_us
 def move_forum_content_handler(sender, **kwargs):
     Thread.objects.filter(forum=sender).update(forum=kwargs['move_to'])
     Post.objects.filter(forum=sender).update(forum=kwargs['move_to'])
+    Karma.objects.filter(forum=sender).update(forum=kwargs['move_to'])
     Change.objects.filter(forum=sender).update(forum=kwargs['move_to'])
     Checkpoint.objects.filter(forum=sender).update(forum=kwargs['move_to'])
 
@@ -295,6 +315,7 @@ move_forum_content.connect(move_forum_content_handler, dispatch_uid="move_forum_
 
 def move_thread_handler(sender, **kwargs):
     Post.objects.filter(forum=sender.forum_pk).update(forum=kwargs['move_to'])
+    Karma.objects.filter(forum=sender.forum_pk).update(forum=kwargs['move_to'])
     Change.objects.filter(forum=sender.forum_pk).update(forum=kwargs['move_to'])
     Checkpoint.objects.filter(forum=sender.forum_pk).update(forum=kwargs['move_to'])
 
@@ -303,6 +324,7 @@ move_thread.connect(move_thread_handler, dispatch_uid="move_thread")
 
 def merge_thread_handler(sender, **kwargs):
     Post.objects.filter(thread=sender).update(thread=kwargs['new_thread'], merge=F('merge') + kwargs['merge'])
+    Karma.objects.filter(thread=sender).update(thread=kwargs['new_thread'])
     Change.objects.filter(thread=sender).update(thread=kwargs['new_thread'])
     Checkpoint.objects.filter(thread=sender).delete()
 
@@ -311,6 +333,7 @@ merge_thread.connect(merge_thread_handler, dispatch_uid="merge_threads")
 
 def move_posts_handler(sender, **kwargs):
     Change.objects.filter(post=sender).update(forum=kwargs['move_to'].forum, thread=kwargs['move_to'])
+    Karma.objects.filter(post=sender).update(forum=kwargs['move_to'].forum, thread=kwargs['move_to'])
     if sender.checkpoints:
         prev_post = Post.objects.filter(thread=sender.thread_id).filter(merge__lte=sender.merge).exclude(id=sender.pk).order_by('merge', '-id')[:1][0]
         Checkpoint.objects.filter(post=sender).update(post=prev_post)
@@ -324,7 +347,11 @@ move_post.connect(move_posts_handler, dispatch_uid="move_posts")
 def merge_posts_handler(sender, **kwargs):
     Change.objects.filter(post=sender).update(post=kwargs['new_post'])
     Checkpoint.objects.filter(post=sender).update(post=kwargs['new_post'])
+    Karma.objects.filter(post=sender).update(post=kwargs['new_post'])
     if sender.checkpoints:
         kwargs['new_post'].checkpoints = True
+    kwargs['new_post'].upvotes += self.upvotes
+    kwargs['new_post'].downvotes += self.downvotes
+    kwargs['new_post'].score += self.score
 
 merge_post.connect(merge_posts_handler, dispatch_uid="merge_posts")