index.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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.conf import settings
  6. from misago.shortcuts import render_to_response
  7. from misago.models import Forum, Post, Rank, Session, Thread
  8. from misago.readstrackers import ForumsTracker
  9. def index(request):
  10. # Threads ranking
  11. threads_ranking = []
  12. if settings.thread_ranking_type != 'none':
  13. cache_token = 'thread_ranking_%s_%s' % (settings.thread_ranking_type, request.user.make_acl_key())
  14. threads_ranking = cache.get(cache_token, 'nada')
  15. if threads_ranking == 'nada':
  16. threads_ranking = []
  17. ranking_queryset = Thread.objects.filter(moderated=False).filter(deleted=False).filter(forum__in=Forum.objects.readable_forums(request.acl)).prefetch_related('forum')
  18. if settings.thread_ranking_type == 'popular':
  19. ranking_queryset = ranking_queryset.order_by('-score', '-last')
  20. if settings.thread_ranking_type == 'last':
  21. ranking_queryset = ranking_queryset.order_by('-last')
  22. if settings.thread_ranking_type == 'start':
  23. ranking_queryset = ranking_queryset.order_by('-start')
  24. for thread in ranking_queryset[:settings.thread_ranking_size]:
  25. thread.forum_name = thread.forum.name
  26. thread.forum_slug = thread.forum.slug
  27. threads_ranking.append(thread)
  28. cache.set(cache_token, threads_ranking, 60 * settings.thread_ranking_refresh)
  29. # Users online
  30. users_online = request.onlines.stats(request)
  31. # Ranks online
  32. if settings.online_counting != 'real':
  33. ranks_list = cache.get('ranks_online', 'nada')
  34. else:
  35. ranks_list = 'nada'
  36. if ranks_list == 'nada':
  37. ranks_dict = {}
  38. ranks_list = []
  39. users_list = []
  40. for rank in Rank.objects.filter(on_index=True).order_by('order'):
  41. rank_entry = {
  42. 'id':rank.id,
  43. 'name': rank.name,
  44. 'slug': rank.slug if rank.as_tab else '',
  45. 'style': rank.style,
  46. 'title': rank.title,
  47. 'online': [],
  48. 'pks': [],
  49. }
  50. ranks_list.append(rank_entry)
  51. ranks_dict[rank.pk] = rank_entry
  52. if ranks_dict:
  53. for session in Session.objects.select_related('user').filter(rank__in=ranks_dict.keys()).filter(last__gte=timezone.now() - timedelta(seconds=settings.online_counting_frequency)).filter(user__isnull=False):
  54. if not session.user_id in users_list:
  55. ranks_dict[session.user.rank_id]['online'].append(session.user)
  56. ranks_dict[session.user.rank_id]['pks'].append(session.user.pk)
  57. users_list.append(session.user_id)
  58. # Assert we are on list
  59. if (request.user.is_authenticated() and request.user.rank_id in ranks_dict.keys()
  60. and not request.user.pk in users_list):
  61. ranks_dict[request.user.rank_id]['online'].append(request.user)
  62. ranks_dict[request.user.rank_id]['pks'].append(request.user.pk)
  63. users_list.append(request.user.pk)
  64. del ranks_dict
  65. del users_list
  66. if settings.online_counting != 'real':
  67. cache.set('ranks_online', ranks_list, settings.online_counting_frequency)
  68. elif request.user.is_authenticated():
  69. for rank in ranks_list:
  70. if rank['id'] == request.user.rank_id and not request.user.pk in rank['pks']:
  71. rank['online'].append(request.user)
  72. rank['pks'].append(request.user.pk)
  73. break
  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 render_to_response('index.html',
  81. {
  82. 'forums_list': forums_list,
  83. 'ranks_online': ranks_list,
  84. 'users_online': users_online,
  85. 'threads_ranking': threads_ranking,
  86. 'hook_above_forum_home': u'',
  87. 'hook_below_forum_home': u'',
  88. 'hook_above_home_forums_list': u'',
  89. 'hook_below_home_forums_list': u'',
  90. 'hook_above_home_sidepanel': u'',
  91. 'hook_after_home_sidepanel_ranks_online': u'',
  92. 'hook_after_home_sidepanel_popular_threads': u'',
  93. 'hook_after_home_sidepanel_forum_stats': u'',
  94. 'hook_below_home_sidepanel': u'',
  95. },
  96. context_instance=RequestContext(request));