from datetime import timedelta from django.core.cache import cache from django.template import RequestContext from django.utils import timezone from misago.conf import settings from misago.shortcuts import render_to_response from misago.models import Forum, Post, Rank, Session, Thread from misago.readstrackers import ForumsTracker def index(request): # Threads ranking threads_ranking = [] if settings.thread_ranking_type != 'none': cache_token = 'thread_ranking_%s_%s' % (settings.thread_ranking_type, request.user.make_acl_key()) threads_ranking = cache.get(cache_token, 'nada') if threads_ranking == 'nada': threads_ranking = [] ranking_queryset = Thread.objects.filter(moderated=False).filter(deleted=False).filter(forum__in=Forum.objects.readable_forums(request.acl)).prefetch_related('forum') if settings.thread_ranking_type == 'popular': ranking_queryset = ranking_queryset.order_by('-score', '-last') if settings.thread_ranking_type == 'last': ranking_queryset = ranking_queryset.order_by('-last') if settings.thread_ranking_type == 'start': ranking_queryset = ranking_queryset.order_by('-start') for thread in ranking_queryset[:settings.thread_ranking_size]: thread.forum_name = thread.forum.name thread.forum_slug = thread.forum.slug threads_ranking.append(thread) cache.set(cache_token, threads_ranking, 60 * settings.thread_ranking_refresh) # Users online users_online = request.onlines.stats(request) # Ranks online if settings.online_counting != 'real': ranks_list = cache.get('ranks_online', 'nada') else: ranks_list = 'nada' if ranks_list == 'nada': ranks_dict = {} ranks_list = [] users_list = [] for rank in Rank.objects.filter(on_index=True).order_by('order'): rank_entry = { 'id':rank.id, 'name': rank.name, 'slug': rank.slug if rank.as_tab else '', 'style': rank.style, 'title': rank.title, 'online': [], 'pks': [], } ranks_list.append(rank_entry) ranks_dict[rank.pk] = rank_entry if ranks_dict: 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): if not session.user_id in users_list: ranks_dict[session.user.rank_id]['online'].append(session.user) ranks_dict[session.user.rank_id]['pks'].append(session.user.pk) users_list.append(session.user_id) # Assert we are on list if (request.user.is_authenticated() and request.user.rank_id in ranks_dict.keys() and not request.user.pk in users_list): ranks_dict[request.user.rank_id]['online'].append(request.user) ranks_dict[request.user.rank_id]['pks'].append(request.user.pk) users_list.append(request.user.pk) del ranks_dict del users_list if settings.online_counting != 'real': cache.set('ranks_online', ranks_list, settings.online_counting_frequency) elif request.user.is_authenticated(): for rank in ranks_list: if rank['id'] == request.user.rank_id and not request.user.pk in rank['pks']: rank['online'].append(request.user) rank['pks'].append(request.user.pk) break # Load reads tracker and build forums list reads_tracker = ForumsTracker(request.user) forums_list = Forum.objects.treelist(request.acl.forums, tracker=reads_tracker) # Whitelist ignored members Forum.objects.ignored_users(request.user, forums_list) # Render page return render_to_response('index.html', { 'forums_list': forums_list, 'ranks_online': ranks_list, 'users_online': users_online, 'threads_ranking': threads_ranking, 'hook_above_forum_home': u'', 'hook_below_forum_home': u'', 'hook_above_home_forums_list': u'', 'hook_below_home_forums_list': u'', 'hook_above_home_sidepanel': u'', 'hook_after_home_sidepanel_ranks_online': u'', 'hook_after_home_sidepanel_popular_threads': u'', 'hook_after_home_sidepanel_forum_stats': u'', 'hook_below_home_sidepanel': u'', }, context_instance=RequestContext(request));