list.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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.cache import cache
  9. from misago.core.shortcuts import (
  10. get_int_or_404, get_object_or_404, paginate, pagination_dict)
  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. 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 = get_user_model().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. users = list_page.object_list
  54. make_users_status_aware(request.user, users)
  55. data = pagination_dict(list_page)
  56. data.update({
  57. 'results': UserSerializer(users, many=True).data
  58. })
  59. return Response(data)
  60. LISTS = {
  61. 'active': active,
  62. }
  63. def list_endpoint(request):
  64. list_type = request.query_params.get('list')
  65. list_handler = LISTS.get(list_type)
  66. if list_handler:
  67. return list_handler(request)
  68. else:
  69. return generic(request)