ranks.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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=None):
  9. cached_online = cache.get(RANKS_CACHE_NAME, 'nada')
  10. if viewer.is_authenticated() and viewer.rank.is_on_index:
  11. if cached_online != 'nada':
  12. for rank in cached_online:
  13. if rank['pk'] == viewer.rank_id:
  14. for user in rank['online']:
  15. if user['id'] == viewer.pk:
  16. break
  17. else:
  18. cached_online = 'nada'
  19. else:
  20. cached_online = 'nada'
  21. if cached_online == 'nada':
  22. cached_online = get_ranks_from_db()
  23. cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME)
  24. return cached_online
  25. else:
  26. return cached_online
  27. def get_ranks_from_db():
  28. _displayed_ranks = []
  29. ranks_dict = {}
  30. for rank in Rank.objects.filter(is_on_index=True).order_by('order'):
  31. ranks_dict[rank.pk] = {
  32. 'id': rank.id,
  33. 'pk': rank.pk,
  34. 'name': rank.name,
  35. 'slug': rank.slug,
  36. 'description': rank.description,
  37. 'title': rank.title,
  38. 'css_class': rank.css_class,
  39. 'online': []
  40. }
  41. _displayed_ranks.append(ranks_dict[rank.pk])
  42. queryset = get_online_queryset().filter(is_visible_on_index=True)
  43. for tracker in queryset.iterator():
  44. if tracker.user.rank_id in ranks_dict:
  45. ranks_dict[tracker.user.rank_id]['online'].append({
  46. 'id': tracker.user.id,
  47. 'pk': tracker.user.pk,
  48. 'username': tracker.user.username,
  49. 'slug': tracker.user.slug,
  50. 'title': tracker.user.title,
  51. })
  52. ranks_online = []
  53. for rank in _displayed_ranks:
  54. if rank['online']:
  55. ranks_online.append(rank)
  56. return ranks_online
  57. def clear_ranks_online_cache():
  58. cache.delete(RANKS_CACHE_NAME)