Browse Source

Make sure onlined user is visible on index on first request

Rafał Pitoń 10 years ago
parent
commit
4aaebd76e2
1 changed files with 37 additions and 22 deletions
  1. 37 22
      misago/users/online/ranks.py

+ 37 - 22
misago/users/online/ranks.py

@@ -13,13 +13,14 @@ RANKS_CACHE_TIME = 3 * 60
 
 
 
 
 def get_ranks_online(viewer):
 def get_ranks_online(viewer):
-    cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
+    viewer_is_listed = viewer.is_authenticated() and viewer.rank.is_on_index
 
 
-    if viewer and ranks_list_missing_viewer(viewer, cached_online):
+    cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
+    if viewer_is_listed and ranks_list_missing_viewer(viewer, cached_online):
         cached_online = 'nada'
         cached_online = 'nada'
 
 
     if cached_online == 'nada':
     if cached_online == 'nada':
-        cached_online = get_ranks_from_db()
+        cached_online = get_ranks_from_db(viewer if viewer_is_listed else None)
         cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
         cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
 
 
     if not viewer.acl['can_see_hidden_users']:
     if not viewer.acl['can_see_hidden_users']:
@@ -29,21 +30,18 @@ def get_ranks_online(viewer):
 
 
 
 
 def ranks_list_missing_viewer(viewer, online_list):
 def ranks_list_missing_viewer(viewer, online_list):
-    if viewer.is_authenticated() and viewer.rank.is_on_index:
-        if online_list != 'nada':
-            for rank in online_list:
-                if rank['pk'] == viewer.rank_id:
-                    for user in rank['online']:
-                        if user['id'] == viewer.pk:
-                            cache_is_hiding = user['is_hiding_presence']
-                            viewer_is_hiding = viewer.is_hiding_presence
-                            return cache_is_hiding != viewer_is_hiding
-                    else:
-                        return True
-            else:
-                return True
-    else:
-        return False
+    if online_list != 'nada':
+        for rank in online_list:
+            if rank['pk'] == viewer.rank_id:
+                for user in rank['online']:
+                    if user['id'] == viewer.pk:
+                        cache_is_hiding = user['is_hiding_presence']
+                        viewer_is_hiding = viewer.is_hiding_presence
+                        return cache_is_hiding != viewer_is_hiding
+                else:
+                    return True
+        else:
+            return True
 
 
 
 
 def filter_visiblity_preference(viewer, ranks_online):
 def filter_visiblity_preference(viewer, ranks_online):
@@ -66,8 +64,8 @@ def filter_visiblity_preference(viewer, ranks_online):
     return visible_ranks
     return visible_ranks
 
 
 
 
-def get_ranks_from_db():
-    _displayed_ranks = []
+def get_ranks_from_db(include_viewer):
+    displayed_ranks = []
 
 
     ranks_dict = {}
     ranks_dict = {}
     for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
     for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
@@ -82,7 +80,7 @@ def get_ranks_from_db():
             'has_ninjas': False,
             'has_ninjas': False,
             'online': []
             'online': []
         }
         }
-        _displayed_ranks.append(ranks_dict[rank.pk])
+        displayed_ranks.append(ranks_dict[rank.pk])
 
 
     queryset = get_online_queryset().filter(is_visible_on_index=True)
     queryset = get_online_queryset().filter(is_visible_on_index=True)
     for tracker in queryset.iterator():
     for tracker in queryset.iterator():
@@ -99,8 +97,25 @@ def get_ranks_from_db():
             if tracker.user.is_hiding_presence:
             if tracker.user.is_hiding_presence:
                 ranks_dict[tracker.user.rank_id]['has_ninjas'] = True
                 ranks_dict[tracker.user.rank_id]['has_ninjas'] = True
 
 
+    if include_viewer and include_viewer.rank_id in ranks_dict:
+        viewer_rank = ranks_dict[include_viewer.rank_id]
+        if include_viewer.is_hiding_presence:
+            viewer_rank['has_ninjas'] = True
+        for online in viewer_rank['online']:
+            if online['pk'] == include_viewer.pk:
+                break
+        else:
+            viewer_rank['online'].append({
+                'id': include_viewer.id,
+                'pk': include_viewer.pk,
+                'username': include_viewer.username,
+                'slug': include_viewer.slug,
+                'title': include_viewer.title,
+                'is_hiding_presence': include_viewer.is_hiding_presence
+            })
+
     ranks_online = []
     ranks_online = []
-    for rank in _displayed_ranks:
+    for rank in displayed_ranks:
         if rank['online']:
         if rank['online']:
             ranks_online.append(rank)
             ranks_online.append(rank)
     return ranks_online
     return ranks_online