ranks.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
  10. if viewer and ranks_list_missing_viewer(viewer, cached_online):
  11. cached_online = 'nada'
  12. if cached_online == 'nada':
  13. cached_online = get_ranks_from_db()
  14. cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
  15. if not viewer.acl['can_see_hidden_users']:
  16. return filter_visiblity_preference(viewer, cached_online)
  17. else:
  18. return cached_online
  19. def ranks_list_missing_viewer(viewer, online_list):
  20. if viewer.is_authenticated() and viewer.rank.is_on_index:
  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. else:
  34. return False
  35. def filter_visiblity_preference(viewer, ranks_online):
  36. visible_ranks = []
  37. for rank in ranks_online:
  38. visible_users = []
  39. if rank['has_ninjas']:
  40. for user in rank['online']:
  41. if viewer.is_authenticated() and user['pk'] == viewer.pk:
  42. is_viewer = True
  43. else:
  44. is_viewer = False
  45. if is_viewer or not user['is_hiding_presence']:
  46. visible_users.append(user)
  47. if visible_users:
  48. rank['online'] = visible_users
  49. visible_ranks.append(rank)
  50. else:
  51. visible_ranks.append(rank)
  52. return visible_ranks
  53. def get_ranks_from_db():
  54. _displayed_ranks = []
  55. ranks_dict = {}
  56. for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
  57. ranks_dict[rank.pk] = {
  58. 'id': rank.id,
  59. 'pk': rank.pk,
  60. 'name': rank.name,
  61. 'slug': rank.slug,
  62. 'description': rank.description,
  63. 'title': rank.title,
  64. 'css_class': rank.css_class,
  65. 'has_ninjas': False,
  66. 'online': []
  67. }
  68. _displayed_ranks.append(ranks_dict[rank.pk])
  69. queryset = get_online_queryset().filter(is_visible_on_index=True)
  70. for tracker in queryset.iterator():
  71. if tracker.user.rank_id in ranks_dict:
  72. ranks_dict[tracker.user.rank_id]['online'].append({
  73. 'id': tracker.user.id,
  74. 'pk': tracker.user.pk,
  75. 'username': tracker.user.username,
  76. 'slug': tracker.user.slug,
  77. 'title': tracker.user.title,
  78. 'is_hiding_presence': tracker.user.is_hiding_presence
  79. })
  80. if tracker.user.is_hiding_presence:
  81. ranks_dict[tracker.user.rank_id]['has_ninjas'] = True
  82. ranks_online = []
  83. for rank in _displayed_ranks:
  84. if rank['online']:
  85. ranks_online.append(rank)
  86. return ranks_online
  87. def clear_ranks_online_cache():
  88. cache.delete(RANKS_CACHE_NAME)