from datetime import timedelta from django.utils import timezone from misago.core.cache import cache from misago.users.models import Online, Rank from misago.users.online.utils import get_online_queryset RANKS_CACHE_NAME = 'misago_ranks_online' RANKS_CACHE_TIME = 3 * 60 def get_ranks_online(viewer=None): cached_online = cache.get(RANKS_CACHE_NAME, 'nada') if viewer.is_authenticated() and viewer.rank.is_on_index: if cached_online != 'nada': for rank in cached_online: if rank['pk'] == viewer.rank_id: for user in rank['online']: if user['id'] == viewer.pk: break else: cached_online = 'nada' else: cached_online = 'nada' if cached_online == 'nada': cached_online = get_ranks_from_db() cache.set(RANKS_CACHE_NAME, cached_online, RANKS_CACHE_TIME) return cached_online else: return cached_online def get_ranks_from_db(): _displayed_ranks = [] ranks_dict = {} for rank in Rank.objects.filter(is_on_index=True).order_by('order'): ranks_dict[rank.pk] = { 'id': rank.id, 'pk': rank.pk, 'name': rank.name, 'slug': rank.slug, 'description': rank.description, 'title': rank.title, 'css_class': rank.css_class, 'online': [] } _displayed_ranks.append(ranks_dict[rank.pk]) queryset = get_online_queryset().filter(is_visible_on_index=True) for tracker in queryset.iterator(): if tracker.user.rank_id in ranks_dict: ranks_dict[tracker.user.rank_id]['online'].append({ 'id': tracker.user.id, 'pk': tracker.user.pk, 'username': tracker.user.username, 'slug': tracker.user.slug, 'title': tracker.user.title, }) ranks_online = [] for rank in _displayed_ranks: if rank['online']: ranks_online.append(rank) return ranks_online def clear_ranks_online_cache(): cache.delete(RANKS_CACHE_NAME)