ranks.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from misago.core.cache import cache
  2. from misago.users.models import Rank
  3. from misago.users.online.utils import get_online_queryset
  4. RANKS_CACHE_NAME = 'misago_ranks_online'
  5. RANKS_CACHE_TIME = 3 * 60
  6. def get_ranks_online(viewer):
  7. viewer_is_listed = viewer.is_authenticated() and viewer.rank.is_on_index
  8. cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
  9. if viewer_is_listed and ranks_list_missing_viewer(viewer, cached_online):
  10. cached_online = 'nada'
  11. if cached_online == 'nada':
  12. cached_online = get_ranks_from_db(viewer if viewer_is_listed else None)
  13. cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
  14. if not viewer.acl['can_see_hidden_users']:
  15. return filter_visiblity_preference(viewer, cached_online)
  16. else:
  17. return cached_online
  18. def ranks_list_missing_viewer(viewer, online_list):
  19. if online_list != 'nada':
  20. for rank in online_list:
  21. if rank['pk'] == viewer.rank_id:
  22. for user in rank['online']:
  23. if user['id'] == viewer.pk:
  24. cache_is_hiding = user['is_hiding_presence']
  25. viewer_is_hiding = viewer.is_hiding_presence
  26. return cache_is_hiding != viewer_is_hiding
  27. else:
  28. return True
  29. else:
  30. return True
  31. def filter_visiblity_preference(viewer, ranks_online):
  32. visible_ranks = []
  33. for rank in ranks_online:
  34. visible_users = []
  35. if rank['has_ninjas']:
  36. for user in rank['online']:
  37. if viewer.is_authenticated() and user['pk'] == viewer.pk:
  38. is_viewer = True
  39. else:
  40. is_viewer = False
  41. if is_viewer or not user['is_hiding_presence']:
  42. visible_users.append(user)
  43. if visible_users:
  44. rank['online'] = visible_users
  45. visible_ranks.append(rank)
  46. else:
  47. visible_ranks.append(rank)
  48. return visible_ranks
  49. def get_ranks_from_db(include_viewer):
  50. displayed_ranks = []
  51. ranks_dict = {}
  52. for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
  53. ranks_dict[rank.pk] = {
  54. 'id': rank.id,
  55. 'pk': rank.pk,
  56. 'name': rank.name,
  57. 'slug': rank.slug,
  58. 'description': rank.description,
  59. 'title': rank.title,
  60. 'css_class': rank.css_class,
  61. 'has_ninjas': False,
  62. 'online': []
  63. }
  64. displayed_ranks.append(ranks_dict[rank.pk])
  65. queryset = get_online_queryset().filter(is_visible_on_index=True)
  66. for tracker in queryset.iterator():
  67. if tracker.user.rank_id in ranks_dict:
  68. ranks_dict[tracker.user.rank_id]['online'].append({
  69. 'id': tracker.user.id,
  70. 'pk': tracker.user.pk,
  71. 'username': tracker.user.username,
  72. 'slug': tracker.user.slug,
  73. 'title': tracker.user.title,
  74. 'is_hiding_presence': tracker.user.is_hiding_presence
  75. })
  76. if tracker.user.is_hiding_presence:
  77. ranks_dict[tracker.user.rank_id]['has_ninjas'] = True
  78. if include_viewer and include_viewer.rank_id in ranks_dict:
  79. viewer_rank = ranks_dict[include_viewer.rank_id]
  80. if include_viewer.is_hiding_presence:
  81. viewer_rank['has_ninjas'] = True
  82. for online in viewer_rank['online']:
  83. if online['pk'] == include_viewer.pk:
  84. break
  85. else:
  86. viewer_rank['online'].append({
  87. 'id': include_viewer.id,
  88. 'pk': include_viewer.pk,
  89. 'username': include_viewer.username,
  90. 'slug': include_viewer.slug,
  91. 'title': include_viewer.title,
  92. 'is_hiding_presence': include_viewer.is_hiding_presence
  93. })
  94. ranks_online = []
  95. for rank in displayed_ranks:
  96. if rank['online']:
  97. ranks_online.append(rank)
  98. return ranks_online
  99. def clear_ranks_online_cache():
  100. cache.delete(RANKS_CACHE_NAME)