list.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 rest_framework.pagination import PageNumberPagination
  6. from misago.conf import settings
  7. from misago.core.cache import cache
  8. from misago.core.shortcuts import get_object_or_404
  9. from misago.forums.models import Forum
  10. from misago.users.models import Rank
  11. from misago.users.serializers import ScoredUserSerializer
  12. def active(request, queryset):
  13. cache_key = 'misago_active_posters_ranking'
  14. ranking = cache.get(cache_key, False)
  15. if ranking is False:
  16. ranking = real_active()
  17. cache.set(cache_key, ranking, 18*3600)
  18. return ranking
  19. def real_active():
  20. tracked_period = settings.MISAGO_RANKING_LENGTH
  21. tracked_since = timezone.now() - timedelta(days=tracked_period)
  22. ranked_forums = [forum.pk for forum in Forum.objects.all_forums()]
  23. User = get_user_model()
  24. queryset = User.objects.filter(posts__gt=0)
  25. queryset = queryset.filter(post__posted_on__gte=tracked_since,
  26. post__forum__in=ranked_forums)
  27. queryset = queryset.annotate(score=Count('post'))
  28. queryset = queryset.select_related('user__rank')
  29. queryset = queryset.order_by('-score', 'slug')
  30. users_ranking = []
  31. for result in queryset[:settings.MISAGO_RANKING_SIZE]:
  32. result.score = result.num_posts
  33. users_ranking.append(result)
  34. return {
  35. 'results': ScoredUserSerializer(users_ranking, many=True).data,
  36. 'meta': {
  37. 'ranking_length': settings.MISAGO_RANKING_LENGTH
  38. }
  39. }
  40. def rank(request, queryset):
  41. rank_slug = request.query_params.get('rank')
  42. if not rank_slug:
  43. return
  44. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  45. queryset = queryset.filter(rank=rank).order_by('slug')
  46. return {'queryset': queryset, 'paginate': True}
  47. LISTS = {
  48. 'active': active,
  49. 'rank': rank,
  50. }
  51. def list_endpoint(request, queryset):
  52. list_type = request.query_params.get('list')
  53. list_handler = LISTS.get(list_type)
  54. if list_handler:
  55. return list_handler(request, queryset)
  56. else:
  57. return