ranks.py 4.1 KB

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