index.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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.shortcuts import render_to_response
  6. from misago.models import Forum, Post, Rank, Session, Thread
  7. from misago.readstrackers import ForumsTracker
  8. def index(request):
  9. # Threads ranking
  10. popular_threads = []
  11. if request.settings['thread_ranking_size'] > 0:
  12. popular_threads = cache.get('thread_ranking_%s' % request.user.make_acl_key(), 'nada')
  13. if popular_threads == 'nada':
  14. popular_threads = []
  15. 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', '-last')[:request.settings['thread_ranking_size']]:
  16. thread.forum_name = thread.forum.name
  17. thread.forum_slug = thread.forum.slug
  18. popular_threads.append(thread)
  19. cache.set('thread_ranking_%s' % request.user.make_acl_key(), popular_threads, 60 * request.settings['thread_ranking_refresh'])
  20. # Users online
  21. users_online = request.onlines.stats(request)
  22. # Ranks online
  23. ranks_list = cache.get('ranks_online', 'nada')
  24. if ranks_list == 'nada':
  25. ranks_dict = {}
  26. ranks_list = []
  27. users_list = []
  28. for rank in Rank.objects.filter(on_index=True).order_by('order'):
  29. rank_entry = {
  30. 'id':rank.id,
  31. 'name': rank.name,
  32. 'slug': rank.slug if rank.as_tab else '',
  33. 'style': rank.style,
  34. 'title': rank.title,
  35. 'online': [],
  36. 'pks': [],
  37. }
  38. ranks_list.append(rank_entry)
  39. ranks_dict[rank.pk] = rank_entry
  40. if ranks_dict:
  41. for session in Session.objects.select_related('user').filter(rank__in=ranks_dict.keys()).filter(last__gte=timezone.now() - timedelta(seconds=request.settings['online_counting_frequency'])).filter(user__isnull=False):
  42. if not session.user_id in users_list:
  43. ranks_dict[session.user.rank_id]['online'].append(session.user)
  44. ranks_dict[session.user.rank_id]['pks'].append(session.user.pk)
  45. users_list.append(session.user_id)
  46. # Assert we are on list
  47. if (request.user.is_authenticated() and request.user.rank_id in ranks_dict.keys()
  48. and not request.user.pk in users_list):
  49. ranks_dict[request.user.rank_id]['online'].append(request.user)
  50. ranks_dict[request.user.rank_id]['pks'].append(request.user.pk)
  51. users_list.append(request.user.pk)
  52. cache.set('team_users_online', users_list, request.settings['online_counting_frequency'])
  53. del ranks_dict
  54. del users_list
  55. cache.set('ranks_online', ranks_list, request.settings['online_counting_frequency'])
  56. elif request.user.is_authenticated():
  57. for rank in ranks_list:
  58. if rank['id'] == request.user.rank_id and not request.user.pk in rank['pks']:
  59. rank['online'].append(request.user)
  60. rank['pks'].append(request.user.pk)
  61. break
  62. # Load reads tracker and build forums list
  63. reads_tracker = ForumsTracker(request.user)
  64. forums_list = Forum.objects.treelist(request.acl.forums, tracker=reads_tracker)
  65. # Whitelist ignored members
  66. Forum.objects.ignored_users(request.user, forums_list)
  67. # Render page
  68. return render_to_response('index.html',
  69. {
  70. 'forums_list': forums_list,
  71. 'ranks_online': ranks_list,
  72. 'users_online': users_online,
  73. 'popular_threads': popular_threads,
  74. 'hook_above_forum_home': u'',
  75. 'hook_below_forum_home': u'',
  76. 'hook_above_home_forums_list': u'',
  77. 'hook_below_home_forums_list': u'',
  78. 'hook_above_home_sidepanel': u'',
  79. 'hook_after_home_sidepanel_ranks_online': u'',
  80. 'hook_after_home_sidepanel_popular_threads': u'',
  81. 'hook_after_home_sidepanel_forum_stats': u'',
  82. 'hook_below_home_sidepanel': u'',
  83. },
  84. context_instance=RequestContext(request));