list.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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.response import Response
  7. from misago.conf import settings
  8. from misago.core.apipaginator import ApiPaginator
  9. from misago.core.cache import cache
  10. from misago.core.shortcuts import get_int_or_404, get_object_or_404
  11. from ...activepostersranking import get_active_posters_ranking
  12. from ...models import Rank
  13. from ...online.utils import make_users_status_aware
  14. from ...serializers import ScoredUserSerializer, UserSerializer
  15. Paginator = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4)
  16. def active(request):
  17. ranking = get_active_posters_ranking()
  18. make_users_status_aware(request.user, ranking['users'], fetch_state=True)
  19. return Response({
  20. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  21. 'results': ScoredUserSerializer(ranking['users'], many=True).data,
  22. 'count': ranking['users_count']
  23. })
  24. def generic(request):
  25. allow_name_search = True
  26. queryset = get_user_model().objects
  27. if not request.user.is_staff:
  28. queryset = queryset.filter(is_active=True)
  29. if request.query_params.get('followers'):
  30. user_pk = get_int_or_404(request.query_params.get('followers'))
  31. queryset = get_object_or_404(queryset, pk=user_pk).followed_by
  32. elif request.query_params.get('follows'):
  33. user_pk = get_int_or_404(request.query_params.get('follows'))
  34. queryset = get_object_or_404(queryset, pk=user_pk).follows
  35. elif request.query_params.get('rank'):
  36. rank_pk = get_int_or_404(request.query_params.get('rank'))
  37. rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True)
  38. queryset = queryset.filter(rank=rank)
  39. allow_name_search = False
  40. else:
  41. raise Http404() # don't use this api for searches
  42. if request.query_params.get('name'):
  43. name_starts_with = request.query_params.get('name').strip().lower()
  44. if name_starts_with and allow_name_search:
  45. queryset = queryset.filter(slug__startswith=name_starts_with)
  46. else:
  47. raise Http404()
  48. queryset = queryset.select_related('rank', 'ban_cache', 'online_tracker')
  49. paginator = Paginator()
  50. users = paginator.paginate_queryset(queryset.order_by('slug'), request)
  51. make_users_status_aware(request.user, users)
  52. return paginator.get_paginated_response(
  53. UserSerializer(users, many=True).data)
  54. LISTS = {
  55. 'active': active,
  56. }
  57. def list_endpoint(request):
  58. list_type = request.query_params.get('list')
  59. list_handler = LISTS.get(list_type)
  60. if list_handler:
  61. return list_handler(request)
  62. else:
  63. return generic(request)