Browse Source

Update checksums on anonymized posts so they sill display

Rafał Pitoń 7 years ago
parent
commit
bc369b5360
2 changed files with 36 additions and 4 deletions
  1. 9 4
      misago/threads/signals.py
  2. 27 0
      misago/threads/tests/test_anonymize_data.py

+ 9 - 4
misago/threads/signals.py

@@ -10,6 +10,7 @@ from misago.core.utils import ANONYMOUS_IP
 from misago.users.signals import anonymize_user_content, delete_user_content, username_changed
 from misago.users.signals import anonymize_user_content, delete_user_content, username_changed
 
 
 from .anonymize import ANONYMIZABLE_EVENTS, anonymize_event, anonymize_post_last_likes
 from .anonymize import ANONYMIZABLE_EVENTS, anonymize_event, anonymize_post_last_likes
+from .checksums import update_post_checksum
 from .models import Attachment, Poll, PollVote, Post, PostEdit, PostLike, Thread
 from .models import Attachment, Poll, PollVote, Post, PostEdit, PostLike, Thread
 
 
 
 
@@ -93,18 +94,18 @@ def delete_user_threads(sender, **kwargs):
     recount_categories = set()
     recount_categories = set()
     recount_threads = set()
     recount_threads = set()
 
 
-    for post in sender.liked_post_set.all():
+    for post in chunk_queryset(sender.liked_post_set):
         cleaned_likes = list(filter(lambda i: i['id'] != sender.id, post.last_likes))
         cleaned_likes = list(filter(lambda i: i['id'] != sender.id, post.last_likes))
         if cleaned_likes != post.last_likes:
         if cleaned_likes != post.last_likes:
             post.last_likes = cleaned_likes
             post.last_likes = cleaned_likes
             post.save(update_fields=['last_likes'])
             post.save(update_fields=['last_likes'])
             
             
-    for thread in chunk_queryset(sender.thread_set.all()):
+    for thread in chunk_queryset(sender.thread_set):
         recount_categories.add(thread.category_id)
         recount_categories.add(thread.category_id)
         with transaction.atomic():
         with transaction.atomic():
             thread.delete()
             thread.delete()
 
 
-    for post in chunk_queryset(sender.post_set.all()):
+    for post in chunk_queryset(sender.post_set):
         recount_categories.add(post.category_id)
         recount_categories.add(post.category_id)
         recount_threads.add(post.thread_id)
         recount_threads.add(post.thread_id)
         with transaction.atomic():
         with transaction.atomic():
@@ -124,7 +125,11 @@ def delete_user_threads(sender, **kwargs):
 
 
 @receiver(anonymize_user_content)
 @receiver(anonymize_user_content)
 def anonymize_user(sender, **kwargs):
 def anonymize_user(sender, **kwargs):
-    Post.objects.filter(poster=sender).update(poster_ip=ANONYMOUS_IP)
+    for post in chunk_queryset(sender.post_set):
+        post.poster_ip = ANONYMOUS_IP
+        update_post_checksum(post)
+        post.save(update_fields=['checksum', 'poster_ip'])
+
     PostEdit.objects.filter(editor=sender).update(editor_ip=ANONYMOUS_IP)
     PostEdit.objects.filter(editor=sender).update(editor_ip=ANONYMOUS_IP)
     PostLike.objects.filter(liker=sender).update(liker_ip=ANONYMOUS_IP)
     PostLike.objects.filter(liker=sender).update(liker_ip=ANONYMOUS_IP)
 
 

+ 27 - 0
misago/threads/tests/test_anonymize_data.py

@@ -3,6 +3,7 @@ from django.test import RequestFactory
 from django.urls import reverse
 from django.urls import reverse
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.core.utils import ANONYMOUS_IP
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 from misago.threads import testutils
 from misago.threads import testutils
@@ -208,3 +209,29 @@ class AnonymizeLikesTests(AuthenticatedUserTestCase):
                 'username': self.user.username,
                 'username': self.user.username,
             },
             },
         ])
         ])
+
+
+class AnonymizePostsTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super(AnonymizePostsTests, self).setUp()
+        self.factory = RequestFactory()
+
+    def get_request(self, user=None):
+        request = self.factory.get('/customer/details')
+        request.user = user or self.user
+        request.user_ip = '127.0.0.1'
+
+        return request
+
+    def test_anonymize_user_posts(self):
+        """post is anonymized by user.anonymize_content"""
+        category = Category.objects.get(slug='first-category')
+        thread = testutils.post_thread(category)
+
+        user = get_mock_user()
+        post = testutils.reply_thread(thread, poster=user)
+        user.anonymize_content()
+
+        anonymized_post = Post.objects.get(pk=post.pk)
+        self.assertEqual(anonymized_post.poster_ip, ANONYMOUS_IP)
+        self.assertTrue(anonymized_post.is_valid)