usernamechanges.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from rest_framework import viewsets
  2. from rest_framework.response import Response
  3. from django.contrib.auth import get_user_model
  4. from django.core.exceptions import PermissionDenied
  5. from django.db.models import Q
  6. from django.shortcuts import get_object_or_404
  7. from django.utils.translation import ugettext as _
  8. from misago.core.shortcuts import get_int_or_404, paginate, pagination_dict
  9. from misago.users.models import UsernameChange
  10. from misago.users.serializers 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_cache.get('can_see_users_name_history'):
  22. raise PermissionDenied(_("You don't have permission to see other users name history."))
  23. return True
  24. class UsernameChangesViewSet(viewsets.GenericViewSet):
  25. permission_classes = (UsernameChangesViewSetPermission, )
  26. serializer_class = UsernameChangeSerializer
  27. def get_queryset(self):
  28. queryset = UsernameChange.objects
  29. if self.request.query_params.get('user'):
  30. user_pk = get_int_or_404(self.request.query_params.get('user'))
  31. queryset = get_object_or_404(UserModel.objects, pk=user_pk).namechanges
  32. if self.request.query_params.get('search'):
  33. search_phrase = self.request.query_params.get('search').strip()
  34. if search_phrase:
  35. queryset = queryset.filter(
  36. Q(changed_by_username__istartswith=search_phrase) | Q(
  37. new_username__istartswith=search_phrase
  38. ) | Q(old_username__istartswith=search_phrase)
  39. )
  40. return queryset.select_related('user', 'changed_by').order_by('-id')
  41. def list(self, request):
  42. page = get_int_or_404(request.GET.get('page', 0))
  43. if page == 1:
  44. page = 0 # api allows explicit first page
  45. queryset = self.get_queryset()
  46. list_page = paginate(queryset, page, 12, 4)
  47. data = pagination_dict(list_page)
  48. data.update({'results': UsernameChangeSerializer(list_page.object_list, many=True).data})
  49. return Response(data)