list.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.db.models import Count
  4. from django.http import Http404
  5. from django.utils import timezone
  6. from rest_framework.pagination import PageNumberPagination
  7. from rest_framework.response import Response
  8. from misago.conf import settings
  9. from misago.core.apipaginator import ApiPaginator
  10. from misago.core.cache import cache
  11. from misago.core.shortcuts import get_object_or_404
  12. from misago.forums.models import Forum
  13. from misago.users.activepostersranking import get_active_posters_ranking
  14. from misago.users.models import Rank
  15. from misago.users.online.utils import make_users_status_aware
  16. from misago.users.serializers import UserSerializer, ScoredUserSerializer
  17. Paginator = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4)
  18. def active(request):
  19. ranking = get_active_posters_ranking()
  20. make_users_status_aware(
  21. ranking['users'], request.user.acl, fetch_state=True)
  22. return Response({
  23. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  24. 'results': ScoredUserSerializer(ranking['users'], many=True).data,
  25. 'count': ranking['users_count']
  26. })
  27. def generic(request):
  28. queryset = get_user_model().objects
  29. if request.query_params.get('followers'):
  30. queryset = get_object_or_404(
  31. queryset, slug=request.query_params.get('followers')).followed_by
  32. elif request.query_params.get('follows'):
  33. queryset = get_object_or_404(
  34. queryset, slug=request.query_params.get('follows')).follows
  35. if request.query_params.get('rank'):
  36. rank_slug = request.query_params.get('rank')
  37. rank = get_object_or_404(Rank.objects, slug=rank_slug, is_tab=True)
  38. queryset = queryset.filter(rank=rank)
  39. if request.query_params.get('name'):
  40. name_starts_with = request.query_params.get('name').strip().lower()
  41. if name_starts_with:
  42. queryset = queryset.filter(slug__startswith=name_starts_with)
  43. else:
  44. raise Http404()
  45. queryset = queryset.select_related('rank', 'ban_cache', 'online_tracker')
  46. paginator = Paginator()
  47. users = paginator.paginate_queryset(queryset.order_by('slug'), request)
  48. make_users_status_aware(users, request.user.acl)
  49. return paginator.get_paginated_response(
  50. UserSerializer(users, many=True).data)
  51. LISTS = {
  52. 'active': active,
  53. }
  54. def list_endpoint(request):
  55. list_type = request.query_params.get('list')
  56. list_handler = LISTS.get(list_type)
  57. if list_handler:
  58. return list_handler(request)
  59. else:
  60. return generic(request)