activepostersranking.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from datetime import timedelta
  2. from django.conf import settings
  3. from django.contrib.auth import get_user_model
  4. from django.db.models import Count
  5. from django.utils import timezone
  6. from misago.forums.models import Forum
  7. from misago.core.cache import cache
  8. ACTIVE_POSTERS_CACHE = 'misago_active_posters_ranking'
  9. def get_active_posters_ranking():
  10. ranking = cache.get(ACTIVE_POSTERS_CACHE, 'nada')
  11. if ranking == 'nada':
  12. ranking = get_real_active_posts_ranking()
  13. cache.set(ACTIVE_POSTERS_CACHE, ranking, 18*3600)
  14. return ranking
  15. def get_real_active_posts_ranking():
  16. tracked_period = settings.MISAGO_RANKING_LENGTH
  17. tracked_since = timezone.now() - timedelta(days=tracked_period)
  18. ranked_forums = [forum.pk for forum in Forum.objects.all_forums()]
  19. User = get_user_model()
  20. queryset = User.objects.filter(posts__gt=0)
  21. queryset = queryset.filter(post__posted_on__gte=tracked_since,
  22. post__forum__in=ranked_forums)
  23. queryset = queryset.annotate(score=Count('post'))
  24. queryset = queryset.select_related('user__rank')
  25. queryset = queryset.order_by('-score')
  26. queryset = queryset[:settings.MISAGO_RANKING_SIZE]
  27. return {
  28. 'users': [user for user in queryset],
  29. 'users_count': queryset.count()
  30. }
  31. def clear_active_posters_ranking():
  32. cache.delete(ACTIVE_POSTERS_CACHE)