activepostersranking.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.db.models import Count
  4. from django.utils import timezone
  5. from misago.categories.models import Category
  6. from misago.conf import settings
  7. from .models import ActivityRanking
  8. UserModel = get_user_model()
  9. def get_active_posters_ranking():
  10. users = []
  11. queryset = ActivityRanking.objects.select_related('user', 'user__rank')
  12. for ranking in queryset.order_by('-score'):
  13. ranking.user.score = ranking.score
  14. users.append(ranking.user)
  15. return {
  16. 'users': users,
  17. 'users_count': len(users),
  18. }
  19. def build_active_posters_ranking():
  20. tracked_period = settings.MISAGO_RANKING_LENGTH
  21. tracked_since = timezone.now() - timedelta(days=tracked_period)
  22. ActivityRanking.objects.all().delete()
  23. ranked_categories = []
  24. for category in Category.objects.all_categories():
  25. ranked_categories.append(category.pk)
  26. queryset = (
  27. UserModel.objects
  28. .filter(
  29. is_active=True,
  30. post__posted_on__gte=tracked_since,
  31. post__category__in=ranked_categories,
  32. )
  33. .annotate(score=Count('post'))
  34. .filter(score__gt=0)
  35. .order_by('-score')
  36. )[:settings.MISAGO_RANKING_SIZE]
  37. new_ranking = []
  38. for ranking in queryset.iterator():
  39. new_ranking.append(ActivityRanking(user=ranking, score=ranking.score))
  40. ActivityRanking.objects.bulk_create(new_ranking)