activepostersranking.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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.categories.models import Category
  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_categories = []
  19. for category in Category.objects.all_categories():
  20. ranked_categories.append(category.pk)
  21. User = get_user_model()
  22. queryset = User.objects.filter(posts__gt=0)
  23. queryset = queryset.filter(post__posted_on__gte=tracked_since,
  24. post__category__in=ranked_categories)
  25. queryset = queryset.annotate(score=Count('post'))
  26. queryset = queryset.select_related('user__rank')
  27. queryset = queryset.order_by('-score')
  28. queryset = queryset[:settings.MISAGO_RANKING_SIZE]
  29. return {
  30. 'users': [user for user in queryset],
  31. 'users_count': queryset.count()
  32. }
  33. def clear_active_posters_ranking():
  34. cache.delete(ACTIVE_POSTERS_CACHE)