ranks.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. for user in rank['online']:
  40. see_self = viewer.is_authenticated() and user['pk'] == viewer.pk
  41. if see_self 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. return visible_ranks
  47. def get_ranks_from_db():
  48. _displayed_ranks = []
  49. ranks_dict = {}
  50. for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
  51. ranks_dict[rank.pk] = {
  52. 'id': rank.id,
  53. 'pk': rank.pk,
  54. 'name': rank.name,
  55. 'slug': rank.slug,
  56. 'description': rank.description,
  57. 'title': rank.title,
  58. 'css_class': rank.css_class,
  59. 'online': []
  60. }
  61. _displayed_ranks.append(ranks_dict[rank.pk])
  62. queryset = get_online_queryset().filter(is_visible_on_index=True)
  63. for tracker in queryset.iterator():
  64. if tracker.user.rank_id in ranks_dict:
  65. ranks_dict[tracker.user.rank_id]['online'].append({
  66. 'id': tracker.user.id,
  67. 'pk': tracker.user.pk,
  68. 'username': tracker.user.username,
  69. 'slug': tracker.user.slug,
  70. 'title': tracker.user.title,
  71. 'is_hiding_presence': tracker.user.is_hiding_presence
  72. })
  73. ranks_online = []
  74. for rank in _displayed_ranks:
  75. if rank['online']:
  76. ranks_online.append(rank)
  77. return ranks_online
  78. def clear_ranks_online_cache():
  79. cache.delete(RANKS_CACHE_NAME)