usernamechanges.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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.apipaginator import ApiPaginator
  8. from misago.core.shortcuts import get_int_or_404, get_object_or_404
  9. from ..models import UsernameChange
  10. from ..rest_permissions import BasePermission
  11. from ..serializers.usernamechange import UsernameChangeSerializer
  12. class UsernameChangesViewSetPermission(BasePermission):
  13. def has_permission(self, request, view):
  14. try:
  15. user_pk = int(request.GET.get('user'))
  16. except (ValueError, TypeError):
  17. user_pk = -1
  18. if user_pk == request.user.pk:
  19. return True
  20. elif not request.user.acl.get('can_see_users_name_history'):
  21. raise PermissionDenied(_("You don't have permission to "
  22. "see other users name history."))
  23. return True
  24. class UsernameChangesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
  25. permission_classes = (UsernameChangesViewSetPermission,)
  26. serializer_class = UsernameChangeSerializer
  27. pagination_class = ApiPaginator(12, 4)
  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. get_user_model().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')