Browse Source

#910: remove readtracker on moved/split posts

Rafał Pitoń 7 years ago
parent
commit
7f81075d30

+ 2 - 5
misago/readtracker/signals.py

@@ -36,11 +36,8 @@ def move_thread_tracker(sender, **kwargs):
 
 
 @receiver(move_post)
-def move_post_tracker(sender, **kwargs):
-    sender.postread_set.update(
-        category=sender.category,
-        thread=sender.thread,
-    )
+def move_post_delete_tracker(sender, **kwargs):
+    sender.postread_set.all().delete()
 
 
 @receiver(thread_read)

+ 40 - 0
misago/threads/tests/test_thread_postmove_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 Thread
 from misago.threads.serializers.moderation import POSTS_LIMIT
@@ -442,3 +443,42 @@ class ThreadPostMoveApiTestCase(AuthenticatedUserTestCase):
         other_thread = Thread.objects.get(pk=other_thread.pk)
         self.assertEqual(other_thread.post_set.filter(pk__in=posts).count(), 4)
         self.assertEqual(other_thread.replies, 4)
+
+    def test_move_posts_reads(self):
+        """api moves posts reads together with posts"""
+        self.override_other_acl({'can_reply_threads': 1})
+
+        other_thread = testutils.post_thread(self.category_b)
+
+        posts = (
+            testutils.reply_thread(self.thread),
+            testutils.reply_thread(self.thread),
+        )
+
+        self.refresh_thread()
+        self.assertEqual(self.thread.replies, 2)
+
+        poststracker.save_read(self.user, self.thread.first_post)
+        for post in posts:
+            poststracker.save_read(self.user, post)
+
+        response = self.client.post(
+            self.api_link,
+            json.dumps({
+                'new_thread': other_thread.get_absolute_url(),
+                'posts': [p.pk for p in posts],
+            }),
+            content_type="application/json",
+        )
+        self.assertEqual(response.status_code, 200)
+
+        other_thread = Thread.objects.get(pk=other_thread.pk)
+
+        # postreads were removed
+        postreads = self.user.postread_set.order_by('id')
+
+        postreads_threads = list(postreads.values_list('thread_id', flat=True))
+        self.assertEqual(postreads_threads, [self.thread.pk])
+
+        postreads_categories = list(postreads.values_list('category_id', flat=True))
+        self.assertEqual(postreads_categories, [self.category.pk])

+ 17 - 2
misago/threads/tests/test_thread_postsplit_api.py

@@ -7,8 +7,9 @@ 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 Thread
+from misago.threads.models import Post, Thread
 from misago.threads.serializers.moderation import POSTS_LIMIT
 from misago.users.testutils import AuthenticatedUserTestCase
 
@@ -20,7 +21,8 @@ class ThreadPostSplitApiTestCase(AuthenticatedUserTestCase):
         self.category = Category.objects.get(slug='first-category')
         self.thread = testutils.post_thread(category=self.category)
         self.posts = [
-            testutils.reply_thread(self.thread).pk, testutils.reply_thread(self.thread).pk
+            testutils.reply_thread(self.thread).pk,
+            testutils.reply_thread(self.thread).pk,
         ]
 
         self.api_link = reverse(
@@ -613,6 +615,10 @@ class ThreadPostSplitApiTestCase(AuthenticatedUserTestCase):
             'can_pin_threads': 2,
         })
 
+        poststracker.save_read(self.user, self.thread.first_post)
+        for post in self.posts:
+            poststracker.save_read(self.user, Post.objects.select_related().get(pk=post))
+
         response = self.client.post(
             self.api_link,
             json.dumps({
@@ -640,3 +646,12 @@ class ThreadPostSplitApiTestCase(AuthenticatedUserTestCase):
 
         # posts were moved to new thread
         self.assertEqual(split_thread.post_set.filter(pk__in=self.posts).count(), 2)
+
+        # postreads were removed
+        postreads = self.user.postread_set.order_by('id')
+
+        postreads_threads = list(postreads.values_list('thread_id', flat=True))
+        self.assertEqual(postreads_threads, [self.thread.pk])
+
+        postreads_categories = list(postreads.values_list('category_id', flat=True))
+        self.assertEqual(postreads_categories, [self.category.pk])