index.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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=request.acl.threads.get_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 = {'id':rank.id, 'name': rank.name, 'style': rank.style, 'title': rank.title, 'online': []}
  27. ranks_list.append(rank_entry)
  28. ranks_dict[rank.pk] = rank_entry
  29. if ranks_dict:
  30. for session in Session.objects.select_related('user').filter(rank__in=ranks_dict.keys()).filter(last__gte=timezone.now() - timedelta(minutes=10)).filter(user__isnull=False):
  31. if not session.user_id in users_list:
  32. ranks_dict[session.user.rank_id]['online'].append(session.user)
  33. users_list.append(session.user_id)
  34. # Assert we are on list
  35. if (request.user.is_authenticated() and request.user.rank_id in ranks_dict.keys()
  36. and not request.user.id in users_list):
  37. ranks_dict[request.user.rank_id]['online'].append(request.user)
  38. del ranks_dict
  39. del users_list
  40. cache.set('ranks_online', ranks_list, 300)
  41. # Users online
  42. users_online = cache.get('users_online', 'nada')
  43. if users_online == 'nada':
  44. users_online = Session.objects.filter(matched=True).filter(crawler__isnull=True).filter(last__gte=timezone.now() - timedelta(seconds=300)).count()
  45. cache.set('users_online', users_online, 300)
  46. if not users_online and not request.user.is_crawler():
  47. # Cheatey trick to make sure we'll never display
  48. # zero users online to human client
  49. users_online = 1
  50. # Load reads tracker and build forums list
  51. reads_tracker = ForumsTracker(request.user)
  52. forums_list = Forum.objects.treelist(request.acl.forums, tracker=reads_tracker)
  53. # Whitelist ignored members
  54. Forum.objects.ignored_users(request.user, forums_list)
  55. # Render page
  56. return request.theme.render_to_response('index.html',
  57. {
  58. 'forums_list': forums_list,
  59. 'ranks_online': ranks_list,
  60. 'users_online': users_online,
  61. 'popular_threads': popular_threads,
  62. },
  63. context_instance=RequestContext(request));