Browse Source

Dirty fucking haxord for weirdness in relations handling on delete cascade.

Ralfp 12 years ago
parent
commit
d1cef9a4e1
2 changed files with 26 additions and 5 deletions
  1. 13 3
      misago/models/postmodel.py
  2. 13 2
      misago/models/threadmodel.py

+ 13 - 3
misago/models/postmodel.py

@@ -1,5 +1,6 @@
 from django.db import models
 from django.db.models import F
+from django.db.models.signals import pre_save, pre_delete
 from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
 from misago.markdown import clear_markdown
@@ -46,6 +47,15 @@ class Post(models.Model):
     class Meta:
         app_label = 'misago'
 
+    def delete(self, *args, **kwargs):
+        """
+        FUGLY HAX for weird stuff that happens with
+        relations on model deletion in MySQL
+        """
+        if self.reported:
+            self.report_set.update(report_for=None)
+        return super(Post, self).delete(*args, **kwargs)
+
     def get_date(self):
         return self.date
 
@@ -114,11 +124,11 @@ class Post(models.Model):
                     pass
 
     def is_reported(self):
-        self.reported = self.reports.filter(weight=2).count() > 0
+        self.reported = self.report_set.filter(weight=2).count() > 0
 
     def live_report(self):
         try:
-            return self.reports.filter(weight=2)[0]
+            return self.report_set.filter(weight=2)[0]
         except IndexError:
             return None
 
@@ -186,4 +196,4 @@ merge_thread.connect(merge_thread_handler, dispatch_uid="merge_threads_posts")
 def sync_user_handler(sender, **kwargs):
     sender.posts = sender.post_set.count()
 
-sync_user_profile.connect(sync_user_handler, dispatch_uid="sync_user_posts")
+sync_user_profile.connect(sync_user_handler, dispatch_uid="sync_user_posts")

+ 13 - 2
misago/models/threadmodel.py

@@ -74,7 +74,7 @@ class Thread(models.Model):
     last_poster_slug = models.SlugField(max_length=255, null=True, blank=True)
     last_poster_style = models.CharField(max_length=255, null=True, blank=True)
     participants = models.ManyToManyField('User', related_name='private_thread_set')
-    report_for = models.ForeignKey('Post', null=True, blank=True, related_name='reports', on_delete=models.SET_NULL)
+    report_for = models.ForeignKey('Post', related_name='report_set', null=True, blank=True, on_delete=models.SET_NULL)
     moderated = models.BooleanField(default=False)
     deleted = models.BooleanField(default=False)
     closed = models.BooleanField(default=False)
@@ -86,6 +86,17 @@ class Thread(models.Model):
     class Meta:
         app_label = 'misago'
 
+    def delete(self, *args, **kwargs):
+        """
+        FUGLY HAX for weird stuff that happens with
+        relations on model deletion in MySQL
+        """
+        if self.replies_reported:
+            clear_reports = [post.pk for post in self.post_set.filter(reported=True)]
+            if clear_reports:
+                Thread.objects.filter(report_for__in=clear_reports).update(report_for=None)
+        return super(Thread, self).delete(*args, **kwargs)
+
     def get_date(self):
         return self.start
 
@@ -244,4 +255,4 @@ pre_delete.connect(delete_user_handler, dispatch_uid="delete_user_participations
 def sync_user_handler(sender, **kwargs):
     sender.threads = sender.thread_set.count()
 
-sync_user_profile.connect(sync_user_handler, dispatch_uid="sync_user_threads")
+sync_user_profile.connect(sync_user_handler, dispatch_uid="sync_user_threads")