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

Move user online utils to take request instead of viewer

rafalp 6 лет назад
Родитель
Сommit
b950fc4118

+ 1 - 1
misago/threads/api/postendpoints/edits.py

@@ -74,7 +74,7 @@ def revert_post_endpoint(request, post):
     add_acl(request.user, post)
 
     if post.poster:
-        make_users_status_aware(request.user, [post.poster])
+        make_users_status_aware(request, [post.poster])
 
     return Response(PostSerializer(post, context={'user': request.user}).data)
 

+ 2 - 2
misago/threads/api/threadposts.py

@@ -111,7 +111,7 @@ class ViewSet(viewsets.ViewSet):
             post.is_new = True
             post.poster.posts = user_posts + 1
 
-            make_users_status_aware(request.user, [post.poster])
+            make_users_status_aware(request, [post.poster])
 
             return Response(PostSerializer(post, context={'user': request.user}).data)
         else:
@@ -141,7 +141,7 @@ class ViewSet(viewsets.ViewSet):
             post.edits = post_edits + 1
 
             if post.poster:
-                make_users_status_aware(request.user, [post.poster])
+                make_users_status_aware(request, [post.poster])
 
             return Response(PostSerializer(post, context={'user': request.user}).data)
         else:

+ 1 - 1
misago/threads/viewmodels/posts.py

@@ -38,7 +38,7 @@ class ViewModel(object):
             if post.poster:
                 posters.append(post.poster)
 
-        make_users_status_aware(request.user, posters)
+        make_users_status_aware(request, posters)
 
         if thread.category.acl['can_see_posts_likes']:
             add_likes_to_posts(request.user, posts)

+ 23 - 22
misago/users/online/utils.py

@@ -9,7 +9,27 @@ from misago.users.models import BanCache, Online
 ACTIVITY_CUTOFF = timedelta(minutes=2)
 
 
-def get_user_status(viewer, user):
+
+def make_users_status_aware(request, users, fetch_state=False):
+    users_dict = {}
+    for user in users:
+        users_dict[user.pk] = user
+
+    if fetch_state:
+        # Fill ban cache on users
+        for ban_cache in BanCache.objects.filter(user__in=users_dict.keys()):
+            users_dict[ban_cache.user_id].ban_cache = ban_cache
+
+        # Fill user online trackers
+        for online_tracker in Online.objects.filter(user__in=users_dict.keys()):
+            users_dict[online_tracker.user_id].online_tracker = online_tracker
+
+    # Fill user states
+    for user in users:
+        user.status = get_user_status(request, user)
+
+
+def get_user_status(request, user):
     user_status = {
         'is_banned': False,
         'is_hidden': user.is_hiding_presence,
@@ -28,7 +48,7 @@ def get_user_status(viewer, user):
 
     try:
         online_tracker = user.online_tracker
-        is_hidden = user.is_hiding_presence and not viewer.acl_cache['can_see_hidden_users']
+        is_hidden = user.is_hiding_presence and not request.user.acl_cache['can_see_hidden_users']
 
         if online_tracker and not is_hidden:
             if online_tracker.last_click >= timezone.now() - ACTIVITY_CUTOFF:
@@ -38,7 +58,7 @@ def get_user_status(viewer, user):
         pass
 
     if user_status['is_hidden']:
-        if viewer.acl_cache['can_see_hidden_users']:
+        if request.user.acl_cache['can_see_hidden_users']:
             user_status['is_hidden'] = False
             if user_status['is_online']:
                 user_status['is_online_hidden'] = True
@@ -55,22 +75,3 @@ def get_user_status(viewer, user):
             user_status['is_offline'] = True
 
     return user_status
-
-
-def make_users_status_aware(viewer, users, fetch_state=False):
-    users_dict = {}
-    for user in users:
-        users_dict[user.pk] = user
-
-    if fetch_state:
-        # Fill ban cache on users
-        for ban_cache in BanCache.objects.filter(user__in=users_dict.keys()):
-            users_dict[ban_cache.user_id].ban_cache = ban_cache
-
-        # Fill user online trackers
-        for online_tracker in Online.objects.filter(user__in=users_dict.keys()):
-            users_dict[online_tracker.user_id].online_tracker = online_tracker
-
-    # Fill user states
-    for user in users:
-        user.status = get_user_status(viewer, user)

+ 8 - 3
misago/users/tests/test_online_utils.py

@@ -1,3 +1,5 @@
+from unittest.mock import Mock
+
 from django.contrib.auth import get_user_model
 
 from misago.acl.testutils import override_acl
@@ -18,7 +20,8 @@ class GetUserStatusTests(AuthenticatedUserTestCase):
         self.other_user.is_hiding_presence = True
         self.other_user.save()
 
-        get_user_status(self.user, self.other_user)
+        request = Mock(user=self.user, cache_versions={"bans": "abcdfghi"})
+        get_user_status(request, self.other_user)
 
     def test_user_visible_hidden_presence(self):
         """get_user_status has no showstopper forvisible  hidden user"""
@@ -29,8 +32,10 @@ class GetUserStatusTests(AuthenticatedUserTestCase):
             'can_see_hidden_users': True,
         })
 
-        get_user_status(self.user, self.other_user)
+        request = Mock(user=self.user, cache_versions={"bans": "abcdfghi"})
+        get_user_status(request, self.other_user)
 
     def test_user_not_hiding_presence(self):
         """get_user_status has no showstoppers for non-hidden user"""
-        get_user_status(self.user, self.other_user)
+        request = Mock(user=self.user, cache_versions={"bans": "abcdfghi"})
+        get_user_status(request, self.other_user)

+ 1 - 1
misago/users/viewmodels/activeposters.py

@@ -7,7 +7,7 @@ from misago.users.serializers import UserCardSerializer
 class ActivePosters(object):
     def __init__(self, request):
         ranking = get_active_posters_ranking()
-        make_users_status_aware(request.user, ranking['users'], fetch_state=True)
+        make_users_status_aware(request, ranking['users'], fetch_state=True)
 
         self.count = ranking['users_count']
         self.tracked_period = settings.MISAGO_RANKING_LENGTH

+ 1 - 1
misago/users/viewmodels/followers.py

@@ -21,7 +21,7 @@ class Followers(object):
                 raise Http404()
 
         list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
-        make_users_status_aware(request.user, list_page.object_list)
+        make_users_status_aware(request, list_page.object_list)
 
         self.users = list_page.object_list
         self.paginator = pagination_dict(list_page)

+ 1 - 1
misago/users/viewmodels/rankusers.py

@@ -16,7 +16,7 @@ class RankUsers(object):
             queryset = queryset.filter(is_active=True)
 
         list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
-        make_users_status_aware(request.user, list_page.object_list)
+        make_users_status_aware(request, list_page.object_list)
 
         self.users = list_page.object_list
         self.paginator = pagination_dict(list_page)