list.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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.shortcuts import get_object_or_404
  7. from django.utils import timezone
  8. from misago.conf import settings
  9. from misago.core.cache import cache
  10. from misago.core.shortcuts import get_int_or_404, paginate, paginated_response
  11. from misago.users.models import Rank
  12. from misago.users.online.utils import make_users_status_aware
  13. from misago.users.serializers import UserCardSerializer
  14. from misago.users.viewmodels import ActivePosters
  15. UserModel = get_user_model()
  16. def active(request):
  17. model = ActivePosters(request)
  18. return Response(model.get_frontend_context())
  19. def generic(request):
  20. page = get_int_or_404(request.GET.get('page', 0))
  21. if page == 1:
  22. page = 0 # api allows explicit first page
  23. allow_name_search = True
  24. queryset = UserModel.objects
  25. if not request.user.is_staff:
  26. queryset = queryset.filter(is_active=True)
  27. if request.query_params.get('rank'):
  28. rank_pk = get_int_or_404(request.query_params.get('rank'))
  29. rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True)
  30. queryset = queryset.filter(rank=rank)
  31. allow_name_search = False
  32. else:
  33. raise Http404() # don't use this api for searches
  34. if request.query_params.get('name'):
  35. name_starts_with = request.query_params.get('name').strip().lower()
  36. if name_starts_with and allow_name_search:
  37. queryset = queryset.filter(slug__startswith=name_starts_with)
  38. else:
  39. raise Http404()
  40. queryset = queryset.select_related(
  41. 'rank', 'ban_cache', 'online_tracker').order_by('slug')
  42. list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
  43. make_users_status_aware(request.user, list_page.object_list)
  44. return paginated_response(list_page, serializer=UserCardSerializer)
  45. LISTS = {
  46. 'active': active,
  47. }
  48. def list_endpoint(request):
  49. list_type = request.query_params.get('list')
  50. list_handler = LISTS.get(list_type)
  51. if list_handler:
  52. return list_handler(request)
  53. else:
  54. return generic(request)
  55. ScoredUserSerializer = UserCardSerializer.extend_fields('meta')