1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- from datetime import timedelta
- from django.contrib.auth import get_user_model
- from django.db.models import Count, Q
- from django.utils import timezone
- from misago.categories.models import Category
- from misago.conf import settings
- from misago.threads.models import Post
- from .models import ActivityRanking
- UserModel = get_user_model()
- def get_active_posters_ranking():
- users = []
- queryset = ActivityRanking.objects.select_related('user', 'user__rank')
- for ranking in queryset.order_by('-score'):
- ranking.user.score = ranking.score
- users.append(ranking.user)
- return {
- 'users': users,
- 'users_count': len(users),
- }
- def build_active_posters_ranking():
- tracked_period = settings.MISAGO_RANKING_LENGTH
- tracked_since = timezone.now() - timedelta(days=tracked_period)
- ActivityRanking.objects.all().delete()
- ranked_categories = []
- for category in Category.objects.all_categories():
- ranked_categories.append(category.pk)
- ranked_posts = Q(posted_on__gte=tracked_since) & Q(category__in=ranked_categories)
- 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)
|