activepostersranking.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 .models import ActivityRanking
  8. def get_active_posters_ranking():
  9. users = []
  10. queryset = ActivityRanking.objects.select_related('user', 'user__rank')
  11. for ranking in queryset.order_by('-score'):
  12. ranking.user.score = ranking.score
  13. users.append(ranking.user)
  14. return {
  15. 'users': users,
  16. 'users_count': len(users),
  17. }
  18. def build_active_posters_ranking():
  19. tracked_period = settings.MISAGO_RANKING_LENGTH
  20. tracked_since = timezone.now() - timedelta(days=tracked_period)
  21. ActivityRanking.objects.all().delete()
  22. ranked_categories = []
  23. for category in Category.objects.all_categories():
  24. ranked_categories.append(category.pk)
  25. queryset = get_user_model().objects.filter(
  26. is_active=True,
  27. posts__gt=0
  28. ).filter(
  29. post__posted_on__gte=tracked_since,
  30. post__category__in=ranked_categories
  31. ).annotate(score=Count('post'))
  32. for ranking in queryset[:settings.MISAGO_RANKING_SIZE].iterator():
  33. ActivityRanking.objects.create(
  34. user=ranking,
  35. score=ranking.score
  36. )