usernamechanges.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import PermissionDenied
  3. from django.db.models import Q
  4. from django.utils.translation import ugettext as _
  5. from rest_framework import mixins, status, viewsets
  6. from rest_framework.response import Response
  7. from misago.core.shortcuts import (
  8. get_int_or_404, get_object_or_404, paginate, pagination_dict)
  9. from misago.users.models import UsernameChange
  10. from misago.users.serializers.usernamechange import UsernameChangeSerializer
  11. from .rest_permissions import BasePermission
  12. UserModel = get_user_model()
  13. class UsernameChangesViewSetPermission(BasePermission):
  14. def has_permission(self, request, view):
  15. try:
  16. user_pk = int(request.GET.get('user'))
  17. except (ValueError, TypeError):
  18. user_pk = -1
  19. if user_pk == request.user.pk:
  20. return True
  21. elif not request.user.acl.get('can_see_users_name_history'):
  22. raise PermissionDenied(_("You don't have permission to "
  23. "see other users name history."))
  24. return True
  25. class UsernameChangesViewSet(viewsets.GenericViewSet):
  26. permission_classes = (UsernameChangesViewSetPermission,)
  27. serializer_class = UsernameChangeSerializer
  28. def get_queryset(self):
  29. queryset = UsernameChange.objects
  30. if self.request.query_params.get('user'):
  31. user_pk = get_int_or_404(self.request.query_params.get('user'))
  32. queryset = get_object_or_404(
  33. UserModel.objects, pk=user_pk).namechanges
  34. if self.request.query_params.get('search'):
  35. search_phrase = self.request.query_params.get('search').strip()
  36. if search_phrase:
  37. queryset = queryset.filter(
  38. Q(changed_by_username__istartswith=search_phrase) |
  39. Q(new_username__istartswith=search_phrase) |
  40. Q(old_username__istartswith=search_phrase)
  41. )
  42. return queryset.select_related('user', 'changed_by').order_by('-id')
  43. def list(self, request):
  44. page = get_int_or_404(request.GET.get('page', 0))
  45. if page == 1:
  46. page = 0 # api allows explicit first page
  47. queryset = self.get_queryset()
  48. list_page = paginate(queryset, page, 12, 4)
  49. data = pagination_dict(list_page)
  50. data.update({
  51. 'results': UsernameChangeSerializer(list_page.object_list, many=True).data
  52. })
  53. return Response(data)