Browse Source

Show execution time after buildactivepostersranking completes, use faster query

rafalp 6 years ago
parent
commit
e18e2b41eb

+ 14 - 8
misago/users/activepostersranking.py

@@ -1,11 +1,12 @@
 from datetime import timedelta
 from datetime import timedelta
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
-from django.db.models import Count
+from django.db.models import Count, Q
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
 from misago.conf import settings
 from misago.conf import settings
+from misago.threads.models import Post
 
 
 from .models import ActivityRanking
 from .models import ActivityRanking
 
 
@@ -37,11 +38,16 @@ def build_active_posters_ranking():
     for category in Category.objects.all_categories():
     for category in Category.objects.all_categories():
         ranked_categories.append(category.pk)
         ranked_categories.append(category.pk)
 
 
-    queryset = UserModel.objects.filter(
-        is_active=True, posts__gt=0
-    ).filter(
-        post__posted_on__gte=tracked_since, post__category__in=ranked_categories
-    ).annotate(score=Count('post'))
+    ranked_posts = Q(posted_on__gte=tracked_since) & Q(category__in=ranked_categories)
 
 
-    for ranking in queryset[:settings.MISAGO_RANKING_SIZE].iterator():
-        ActivityRanking.objects.create(user=ranking, score=ranking.score)
+    queryset = (
+        UserModel.objects
+        .filter(is_active=True)
+        .annotate(score=Count('post', filter=ranked_posts))
+        .order_by('-score')
+    )[:settings.MISAGO_RANKING_SIZE]
+
+    new_ranking = []
+    for ranking in queryset.iterator():
+        new_ranking.append(ActivityRanking(user=ranking, score=ranking.score))
+    ActivityRanking.objects.bulk_create(new_ranking)    

+ 7 - 2
misago/users/management/commands/buildactivepostersranking.py

@@ -1,3 +1,4 @@
+from time import time
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
 
 
 from misago.users.activepostersranking import build_active_posters_ranking
 from misago.users.activepostersranking import build_active_posters_ranking
@@ -7,6 +8,10 @@ class Command(BaseCommand):
     help = 'Builds active posters ranking'
     help = 'Builds active posters ranking'
 
 
     def handle(self, *args, **options):
     def handle(self, *args, **options):
-        self.stdout.write("\n\nBuilding active posters ranking...")
+        self.stdout.write("\nBuilding active posters ranking...")
+
+        start_time = time()
         build_active_posters_ranking()
         build_active_posters_ranking()
-        self.stdout.write("Done!")
+        end_time = time() - start_time
+
+        self.stdout.write("Finished after %.2fs" % end_time)