activepostersranking.py 1.5 KB

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