Rafał Pitoń 10 лет назад
Родитель
Сommit
a3adca6a7d

+ 1 - 1
misago/threads/migrations/0001_initial.py

@@ -40,7 +40,7 @@ class Migration(migrations.Migration):
                 ('checksum', models.CharField(max_length=64)),
                 ('has_attachments', models.BooleanField(default=False)),
                 ('pickled_attachments', models.TextField(null=True, blank=True)),
-                ('posted_on', models.DateTimeField(db_index=True)),
+                ('posted_on', models.DateTimeField()),
                 ('updated_on', models.DateTimeField()),
                 ('edits', models.PositiveIntegerField(default=0)),
                 ('last_editor_name', models.CharField(max_length=255, null=True, blank=True)),

+ 1 - 1
misago/threads/models/post.py

@@ -20,7 +20,7 @@ class Post(models.Model):
                                       related_name="mention_set")
     has_attachments = models.BooleanField(default=False)
     pickled_attachments = models.TextField(null=True, blank=True)
-    posted_on = models.DateTimeField(db_index=True)
+    posted_on = models.DateTimeField()
     updated_on = models.DateTimeField()
     edits = models.PositiveIntegerField(default=0)
     last_editor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+',

+ 32 - 15
misago/users/views/lists.py

@@ -6,8 +6,9 @@ from django.core.urlresolvers import reverse
 from django.db.models import Count
 from django.shortcuts import redirect, render as django_render
 from django.utils import timezone
-from django.views.decorators.cache import cache_page
 
+from misago.forums.models import Forum
+from misago.core.cache import cache
 from misago.core.shortcuts import get_object_or_404, paginate
 
 from misago.users.models import Rank
@@ -63,31 +64,47 @@ def list_view(request, template, queryset, page, context=None):
     return render(request, template, context)
 
 
-def ranking_view(request, template, queryset, context=None):
-    context = context or {}
-    context.update({
-        'users': queryset[:settings.MISAGO_RANKING_SIZE],
-        'users_count': queryset.count()
+@allow_see_list()
+def active_posters(request, page=0):
+    ranking = get_active_posters_rankig()
+
+    template = "misago/userslists/active_posters.html"
+    return render(request, template, {
+        'tracked_period': settings.MISAGO_RANKING_LENGTH,
+        'users': ranking['users'],
+        'users_count': ranking['users_count']
     })
-    return render(request, template, context)
 
 
-#@cache_page(18 * 3600)
-@allow_see_list()
-def active_posters(request, page=0):
+def get_active_posters_rankig():
+    cache_key = 'misago_active_posters_ranking'
+    ranking = cache.get(cache_key, 'nada')
+    if ranking == 'nada':
+        ranking = get_real_active_posts_ranking()
+        cache.set(cache_key, ranking, 18*3600)
+    return ranking
+
+
+def get_real_active_posts_ranking():
     tracked_period = settings.MISAGO_RANKING_LENGTH
     tracked_since = timezone.now() - timedelta(days=tracked_period)
 
+    ranked_forums = [forum.pk for forum in Forum.objects.all_forums()]
+
     User = get_user_model()
-    queryset = User.objects.filter(post__posted_on__gte=tracked_since)
+    queryset = User.objects.filter(posts__gt=0)
+    queryset = queryset.filter(post__posted_on__gte=tracked_since,
+                               post__forum__in=ranked_forums)
     queryset = queryset.annotate(num_posts=Count('post'))
     queryset = queryset.select_related('user__rank')
     queryset = queryset.order_by('-num_posts')
 
-    template = "misago/userslists/active_posters.html"
-    return ranking_view(request, template, queryset, {
-        'tracked_period': tracked_period
-    })
+    queryset = queryset[:settings.MISAGO_RANKING_SIZE]
+
+    return {
+        'users': [user for user in queryset],
+        'users_count': queryset.count()
+    }
 
 
 @allow_see_list(allow_see_users_online_list)