index.py 4.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from datetime import timedelta
  2. from django.core.cache import cache
  3. from django.template import RequestContext
  4. from django.utils import timezone
  5. from misago.models import Forum, Post, Rank, Session, Thread
  6. from misago.readstrackers import ForumsTracker
  7. def index(request):
  8. # Threads ranking
  9. popular_threads = []
  10. if request.settings['thread_ranking_size'] > 0:
  11. popular_threads = cache.get('thread_ranking_%s' % request.user.make_acl_key(), 'nada')
  12. if popular_threads == 'nada':
  13. popular_threads = []
  14. for thread in Thread.objects.filter(moderated=False).filter(deleted=False).filter(forum__in=Forum.objects.readable_forums(request.acl)).prefetch_related('forum').order_by('-score')[:request.settings['thread_ranking_size']]:
  15. thread.forum_name = thread.forum.name
  16. thread.forum_slug = thread.forum.slug
  17. popular_threads.append(thread)
  18. cache.set('thread_ranking_%s' % request.user.make_acl_key(), popular_threads, 60 * request.settings['thread_ranking_refresh'])
  19. # Ranks online
  20. ranks_list = cache.get('ranks_online', 'nada')
  21. if ranks_list == 'nada':
  22. ranks_dict = {}
  23. ranks_list = []
  24. users_list = []
  25. for rank in Rank.objects.filter(on_index=True).order_by('order'):
  26. rank_entry = {
  27. 'id':rank.id,
  28. 'name': rank.name,
  29. 'slug': rank.slug if rank.as_tab else '',
  30. 'style': rank.style,
  31. 'title': rank.title,
  32. 'online': [],
  33. 'pks': [],
  34. }
  35. ranks_list.append(rank_entry)
  36. ranks_dict[rank.pk] = rank_entry
  37. if ranks_dict:
  38. for session in Session.objects.select_related('user').filter(rank__in=ranks_dict.keys()).filter(last__gte=timezone.now() - timedelta(seconds=request.settings['sessions_tracker_sync_frequency'])).filter(user__isnull=False):
  39. if not session.user_id in users_list:
  40. ranks_dict[session.user.rank_id]['online'].append(session.user)
  41. ranks_dict[session.user.rank_id]['pks'].append(session.user.pk)
  42. users_list.append(session.user_id)
  43. # Assert we are on list
  44. if (request.user.is_authenticated() and request.user.rank_id in ranks_dict.keys()
  45. and not request.user.pk in users_list):
  46. ranks_dict[request.user.rank_id]['online'].append(request.user)
  47. ranks_dict[request.user.rank_id]['pks'].append(request.user.pk)
  48. users_list.append(request.user.pk)
  49. cache.set('team_users_online', users_list, request.settings['sessions_tracker_sync_frequency'])
  50. del ranks_dict
  51. del users_list
  52. cache.set('ranks_online', ranks_list, request.settings['sessions_tracker_sync_frequency'])
  53. elif request.user.is_authenticated():
  54. for rank in ranks_list:
  55. if rank['id'] == request.user.rank_id and not request.user.pk in rank['pks']:
  56. rank['online'].append(request.user)
  57. rank['pks'].append(request.user.pk)
  58. request.onlines.count_sessions()
  59. break
  60. # Users online
  61. users_online = request.onlines.stats()
  62. # Here we check for signs that online stats are out of sync
  63. # If they are, we trigger recount. Dont worry about repeated count_sessions()
  64. # calls, function is smart enough to to dont recount more than once per request
  65. if not users_online['members'] and request.user.is_authenticated():
  66. request.onlines.count_sessions()
  67. if users_online['members'] > users_online['all']:
  68. request.onlines.count_sessions()
  69. if (users_online['members'] == users_online['all'] and
  70. not request.user.is_authenticated()):
  71. request.onlines.count_sessions()
  72. # Use recounted information
  73. users_online = request.onlines.stats()
  74. # Load reads tracker and build forums list
  75. reads_tracker = ForumsTracker(request.user)
  76. forums_list = Forum.objects.treelist(request.acl.forums, tracker=reads_tracker)
  77. # Whitelist ignored members
  78. Forum.objects.ignored_users(request.user, forums_list)
  79. # Render page
  80. return request.theme.render_to_response('index.html',
  81. {
  82. 'forums_list': forums_list,
  83. 'ranks_online': ranks_list,
  84. 'users_online': users_online,
  85. 'popular_threads': popular_threads,
  86. },
  87. context_instance=RequestContext(request));