Просмотр исходного кода

further tweaks in private threads api

Rafał Pitoń 8 лет назад
Родитель
Сommit
dea57cbf7e

+ 1 - 0
misago/conf/defaults.py

@@ -144,6 +144,7 @@ MISAGO_POSTING_MIDDLEWARES = (
     'misago.threads.api.postingendpoint.updatestats.UpdateStatsMiddleware',
     'misago.threads.api.postingendpoint.mentions.MentionsMiddleware',
     'misago.threads.api.postingendpoint.subscribe.SubscribeMiddleware',
+    'misago.threads.api.postingendpoint.syncprivatethreads.SyncPrivateThreadsMiddleware',
 
     # Always keep SaveChangesMiddleware middleware after all state-changing middlewares
     'misago.threads.api.postingendpoint.savechanges.SaveChangesMiddleware',

+ 20 - 0
misago/threads/api/postingendpoint/syncprivatethreads.py

@@ -0,0 +1,20 @@
+from misago.categories.models import PRIVATE_THREADS_ROOT_NAME
+
+from ...participants import set_users_unread_private_threads_sync
+from . import PostingEndpoint, PostingMiddleware
+
+
+class SyncPrivateThreadsMiddleware(PostingMiddleware):
+    """
+    Middleware that sets private thread participants to sync unread threads
+    """
+    def use_this_middleware(self):
+        if self.mode == PostingEndpoint.REPLY:
+            return self.thread.thread_type.root_name == PRIVATE_THREADS_ROOT_NAME
+        return False
+
+    def post_save(self, serializer):
+        set_users_unread_private_threads_sync(
+            participants=self.thread.participants_list,
+            exclude_user=self.user
+        )

+ 4 - 6
misago/threads/api/threadposts.py

@@ -14,7 +14,7 @@ from ..models import Post
 from ..moderation import posts as moderation
 from ..permissions.threads import allow_delete_event, allow_delete_post, allow_edit_post, allow_reply_thread
 from ..serializers import AttachmentSerializer, PostSerializer
-from ..viewmodels import ForumThread, ThreadPost, ThreadPosts
+from ..viewmodels import ForumThread, PrivateThread, ThreadPost, ThreadPosts
 from .postendpoints.edits import get_edit_endpoint, revert_post_endpoint
 from .postendpoints.likes import likes_list_endpoint
 from .postendpoints.merge import posts_merge_endpoint
@@ -28,8 +28,8 @@ from .postingendpoint import PostingEndpoint
 
 class ViewSet(viewsets.ViewSet):
     thread = None
-    posts = None
-    post_ = None
+    posts = ThreadPosts
+    post_ = ThreadPost
 
     def get_thread(self, request, pk, read_aware=True, subscription_aware=True, select_for_update=False):
         return self.thread(
@@ -275,9 +275,7 @@ class ViewSet(viewsets.ViewSet):
 
 class ThreadPostsViewSet(ViewSet):
     thread = ForumThread
-    posts = ThreadPosts
-    post_ = ThreadPost
 
 
 class PrivateThreadPostsViewSet(ViewSet):
-    pass
+    thread = PrivateThread

+ 16 - 3
misago/threads/participants.py

@@ -26,12 +26,18 @@ def make_participants_aware(user, thread):
     return thread.participants_list
 
 
-def set_users_unread_private_threads_sync(users=None, participants=None):
+def set_users_unread_private_threads_sync(
+        users=None, participants=None, exclude_user=None):
     users_ids = []
     if users:
         users_ids += [u.pk for u in users]
     if participants:
         users_ids += [p.user_id for p in participants]
+    if exclude_user:
+        users_ids = filter(lambda u: u != exclude_user.pk, users_ids)
+
+    if not users_ids:
+        return
 
     User = get_user_model()
     User.objects.filter(id__in=set(users_ids)).update(
@@ -51,7 +57,10 @@ def change_owner(request, thread, user):
     Replace thread's owner with other
     """
     ThreadParticipant.objects.set_owner(thread, user)
-    set_users_unread_private_threads_sync(participants=thread.participants_list)
+    set_users_unread_private_threads_sync(
+        participants=thread.participants_list,
+        exclude_user=request.user
+    )
 
     if thread.participant and thread.participant.is_owner:
         record_event(request, thread, 'changed_owner', {
@@ -93,7 +102,11 @@ def add_participants(request, thread, users):
     except AttributeError:
         thread_participants = []
 
-    set_users_unread_private_threads_sync(users=users, participants=thread_participants)
+    set_users_unread_private_threads_sync(
+        users=users,
+        participants=thread_participants,
+        exclude_user=request.user
+    )
 
     emails = []
     for user in users:

+ 24 - 1
misago/threads/tests/test_participants.py

@@ -137,7 +137,7 @@ class ParticipantsTests(TestCase):
         for user in users:
             User.objects.get(pk=user.pk, sync_unread_private_threads=True)
 
-    def test_set_participants_isers_unread_private_threads_sync(self):
+    def test_set_participants_users_unread_private_threads_sync(self):
         """
         set_users_unread_private_threads_sync sets sync_unread_private_threads
         flag on users and participants provided to true
@@ -154,3 +154,26 @@ class ParticipantsTests(TestCase):
         set_users_unread_private_threads_sync(users=users, participants=participants)
         for user in users:
             User.objects.get(pk=user.pk, sync_unread_private_threads=True)
+
+    def test_set_users_unread_private_threads_sync_exclude_user(self):
+        """exclude_user kwarg works"""
+        User = get_user_model()
+        users = [
+            User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
+            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+        ]
+
+        set_users_unread_private_threads_sync(users=users, exclude_user=users[0])
+
+        self.assertFalse(User.objects.get(pk=users[0].pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=users[1].pk).sync_unread_private_threads)
+
+    def test_set_users_unread_private_threads_sync_noop(self):
+        """excluding only user is noop"""
+        User = get_user_model()
+        user = User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123")
+
+        with self.assertNumQueries(0):
+            set_users_unread_private_threads_sync(users=[user], exclude_user=user)
+
+        self.assertFalse(User.objects.get(pk=user.pk).sync_unread_private_threads)

+ 17 - 17
misago/threads/tests/test_privatethread_patch_api.py

@@ -261,10 +261,10 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.is_event)
         self.assertTrue(event.event_type, 'participant_left')
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -293,10 +293,10 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.is_event)
         self.assertTrue(event.event_type, 'participant_left')
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -322,10 +322,10 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.is_event)
         self.assertTrue(event.event_type, 'participant_removed')
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -351,10 +351,10 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.is_event)
         self.assertTrue(event.event_type, 'owner_left')
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -375,7 +375,7 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         with self.assertRaises(Thread.DoesNotExist):
             Thread.objects.get(pk=self.thread.pk)
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
         self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
 
@@ -460,10 +460,10 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
 
         self.assertEqual(response.status_code, 200)
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
 
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
@@ -495,9 +495,9 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
 
         self.assertEqual(response.status_code, 200)
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         self.assertTrue(User.objects.get(pk=new_owner.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
@@ -526,10 +526,10 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
 
         self.assertEqual(response.status_code, 200)
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
 
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
@@ -560,10 +560,10 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
 
         self.assertEqual(response.status_code, 200)
 
-        # users were flagged for sync
+        # valid users were flagged for sync
         User = get_user_model()
 
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
         self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered

+ 34 - 0
misago/threads/tests/test_privatethread_reply_api.py

@@ -0,0 +1,34 @@
+from django.contrib.auth import get_user_model
+
+from misago.acl.testutils import override_acl
+
+from .. import testutils
+from ..models import ThreadParticipant
+from .test_privatethreads import PrivateThreadsTestCase
+
+
+class PrivateThreadreplyApiTestCase(PrivateThreadsTestCase):
+    def setUp(self):
+        super(PrivateThreadreplyApiTestCase, self).setUp()
+
+        self.thread = testutils.post_thread(self.category, poster=self.user)
+        self.api_link = self.thread.get_posts_api_url()
+
+        User = get_user_model()
+        self.other_user = User.objects.create_user(
+            'BobBoberson', 'bob@boberson.com', 'pass123')
+
+    def test_api_sets_user_sync_flag(self):
+        """api sets other private thread participants sync thread flag"""
+        ThreadParticipant.objects.set_owner(self.thread, self.user)
+        ThreadParticipant.objects.add_participants(self.thread, [self.other_user])
+
+        response = self.client.post(self.api_link, data={
+            'post': "This is test response!"
+        })
+        self.assertEqual(response.status_code, 200)
+
+        # valid user was flagged to sync
+        User = get_user_model()
+        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)