activepostersranking.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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 ..categories.models import Category
  6. from ..conf.shortcuts import get_dynamic_settings
  7. from .models import ActivityRanking
  8. User = 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 {"users": users, "users_count": len(users)}
  16. def build_active_posters_ranking():
  17. settings = get_dynamic_settings()
  18. tracked_period = settings.top_posters_ranking_length
  19. tracked_since = timezone.now() - timedelta(days=tracked_period)
  20. ActivityRanking.objects.all().delete()
  21. ranked_categories = []
  22. for category in Category.objects.all_categories():
  23. ranked_categories.append(category.pk)
  24. queryset = (
  25. User.objects.filter(
  26. is_active=True,
  27. post__posted_on__gte=tracked_since,
  28. post__category__in=ranked_categories,
  29. )
  30. .annotate(score=Count("post"))
  31. .filter(score__gt=0)
  32. .order_by("-score")
  33. )[: settings.top_posters_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)
  38. return new_ranking