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

Take into account users visibility preferences

Rafał Pitoń 10 лет назад
Родитель
Сommit
6580dc767d
1 измененных файлов с 38 добавлено и 12 удалено
  1. 38 12
      misago/users/online/ranks.py

+ 38 - 12
misago/users/online/ranks.py

@@ -12,27 +12,52 @@ RANKS_CACHE_NAME = 'misago_ranks_online'
 RANKS_CACHE_TIME = 3 * 60
 
 
-def get_ranks_online(viewer=None):
+def get_ranks_online(viewer):
     cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
 
+    if viewer and ranks_list_missing_viewer(viewer, cached_online):
+        cached_online = 'nada'
+
+    if cached_online == 'nada':
+        cached_online = get_ranks_from_db()
+        cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
+
+    if not viewer.acl['can_see_hidden_users']:
+        return filter_visiblity_preference(viewer, cached_online)
+    else:
+        return cached_online
+
+
+def ranks_list_missing_viewer(viewer, online_list):
     if viewer.is_authenticated() and viewer.rank.is_on_index:
-        if cached_online != 'nada':
-            for rank in cached_online:
+        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:
-                            break
+                            cache_is_hiding = user['is_hiding_presence']
+                            viewer_is_hiding = viewer.is_hiding_presence
+                            return cache_is_hiding != viewer_is_hiding
                     else:
-                        cached_online = 'nada'
+                        return True
             else:
-                cached_online = 'nada'
-
-    if cached_online == 'nada':
-        cached_online = get_ranks_from_db()
-        cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
-        return cached_online
+                return True
     else:
-        return cached_online
+        return False
+
+
+def filter_visiblity_preference(viewer, ranks_online):
+    visible_ranks = []
+    for rank in ranks_online:
+        visible_users = []
+        for user in rank['online']:
+            see_self = viewer.is_authenticated() and user['pk'] == viewer.pk
+            if see_self or not user['is_hiding_presence']:
+                visible_users.append(user)
+        if visible_users:
+            rank['online'] = visible_users
+            visible_ranks.append(rank)
+    return visible_ranks
 
 
 def get_ranks_from_db():
@@ -61,6 +86,7 @@ def get_ranks_from_db():
                 'username': tracker.user.username,
                 'slug': tracker.user.slug,
                 'title': tracker.user.title,
+                'is_hiding_presence': tracker.user.is_hiding_presence
             })
 
     ranks_online = []