Browse Source

#910: clear postreads when its merged with other posts

Rafał Pitoń 7 years ago
parent
commit
a3a1d9d699

+ 6 - 1
misago/readtracker/signals.py

@@ -2,7 +2,7 @@ from django.dispatch import Signal, receiver
 
 from misago.categories import PRIVATE_THREADS_ROOT_NAME
 from misago.categories.signals import delete_category_content, move_category_content
-from misago.threads.signals import merge_thread, move_thread, move_post
+from misago.threads.signals import merge_thread, move_thread, merge_post, move_post
 
 
 thread_read = Signal(providing_args=["thread"])
@@ -35,6 +35,11 @@ def move_thread_tracker(sender, **kwargs):
     )
 
 
+@receiver(merge_post)
+def merge_post_delete_tracker(sender, **kwargs):
+    sender.postread_set.all().delete()
+
+
 @receiver(move_post)
 def move_post_delete_tracker(sender, **kwargs):
     sender.postread_set.all().delete()

+ 2 - 0
misago/threads/api/postendpoints/merge.py

@@ -44,6 +44,8 @@ def posts_merge_endpoint(request, thread):
     first_post.update_search_vector()
     first_post.save(update_fields=['search_vector'])
 
+    first_post.postread_set.all().delete()
+
     thread.synchronize()
     thread.save()
 

+ 21 - 0
misago/threads/tests/test_thread_postmerge_api.py

@@ -7,6 +7,7 @@ from django.urls import reverse
 
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
+from misago.readtracker import poststracker
 from misago.threads import testutils
 from misago.threads.models import Post, Thread
 from misago.threads.serializers.moderation import POSTS_LIMIT
@@ -432,3 +433,23 @@ class ThreadPostMergeApiTestCase(AuthenticatedUserTestCase):
             content_type="application/json",
         )
         self.assertEqual(response.status_code, 200)
+
+    def test_merge_remove_reads(self):
+        """two posts merge removes read tracker from post"""
+        post_a = testutils.reply_thread(self.thread, poster=self.user, message="Battęry")
+        post_b = testutils.reply_thread(self.thread, poster=self.user, message="Hórse")
+
+        poststracker.save_read(self.user, post_a)
+        poststracker.save_read(self.user, post_b)
+
+        response = self.client.post(
+            self.api_link,
+            json.dumps({
+                'posts': [post_a.pk, post_b.pk]
+            }),
+            content_type="application/json",
+        )
+        self.assertEqual(response.status_code, 200)
+
+        # both post's were removed from readtracker
+        self.assertEqual(self.user.postread_set.count(), 0)