list.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from datetime import timedelta
  2. from rest_framework.response import Response
  3. from django.contrib.auth import get_user_model
  4. from django.db.models import Count
  5. from django.http import Http404
  6. from django.utils import timezone
  7. from misago.conf import settings
  8. from misago.core.cache import cache
  9. from misago.core.shortcuts import get_int_or_404, get_object_or_404, paginate, paginated_response
  10. from misago.users.activepostersranking import get_active_posters_ranking
  11. from misago.users.models import Rank
  12. from misago.users.online.utils import make_users_status_aware
  13. from misago.users.serializers import ScoredUserSerializer, UserSerializer
  14. UserModel = get_user_model()
  15. def active(request):
  16. ranking = get_active_posters_ranking()
  17. make_users_status_aware(request.user, ranking['users'], fetch_state=True)
  18. return Response({
  19. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  20. 'results': ScoredUserSerializer(ranking['users'], many=True).data,
  21. 'count': ranking['users_count']
  22. })
  23. def generic(request):
  24. page = get_int_or_404(request.GET.get('page', 0))
  25. if page == 1:
  26. page = 0 # api allows explicit first page
  27. allow_name_search = True
  28. queryset = UserModel.objects
  29. if not request.user.is_staff:
  30. queryset = queryset.filter(is_active=True)
  31. if request.query_params.get('followers'):
  32. user_pk = get_int_or_404(request.query_params.get('followers'))
  33. queryset = get_object_or_404(queryset, pk=user_pk).followed_by
  34. elif request.query_params.get('follows'):
  35. user_pk = get_int_or_404(request.query_params.get('follows'))
  36. queryset = get_object_or_404(queryset, pk=user_pk).follows
  37. elif request.query_params.get('rank'):
  38. rank_pk = get_int_or_404(request.query_params.get('rank'))
  39. rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True)
  40. queryset = queryset.filter(rank=rank)
  41. allow_name_search = False
  42. else:
  43. raise Http404() # don't use this api for searches
  44. if request.query_params.get('name'):
  45. name_starts_with = request.query_params.get('name').strip().lower()
  46. if name_starts_with and allow_name_search:
  47. queryset = queryset.filter(slug__startswith=name_starts_with)
  48. else:
  49. raise Http404()
  50. queryset = queryset.select_related(
  51. 'rank', 'ban_cache', 'online_tracker').order_by('slug')
  52. list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
  53. make_users_status_aware(request.user, list_page.object_list)
  54. return paginated_response(list_page, serializer=UserSerializer)
  55. LISTS = {
  56. 'active': active,
  57. }
  58. def list_endpoint(request):
  59. list_type = request.query_params.get('list')
  60. list_handler = LISTS.get(list_type)
  61. if list_handler:
  62. return list_handler(request)
  63. else:
  64. return generic(request)