usernamechanges.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from django.core.exceptions import PermissionDenied
  2. from django.db.models import Q
  3. from django.utils.translation import ugettext as _
  4. from rest_framework import status, viewsets, mixins
  5. from rest_framework.response import Response
  6. from misago.core.apipaginator import ApiPaginator
  7. from misago.users.models import UsernameChange
  8. from misago.users.rest_permissions import BasePermission
  9. from misago.users.serializers.usernamechange import UsernameChangeSerializer
  10. class UsernameChangesViewSetPermission(BasePermission):
  11. def has_permission(self, request, view):
  12. try:
  13. user_id = int(request.GET.get('user'))
  14. except (ValueError, TypeError):
  15. user_id = -1
  16. if user_id == request.user.pk:
  17. return True
  18. elif not request.user.acl.get('can_see_users_name_history'):
  19. raise PermissionDenied(_("You don't have permission to "
  20. "see other users name history."))
  21. return True
  22. class UsernameChangesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
  23. permission_classes = (UsernameChangesViewSetPermission,)
  24. serializer_class = UsernameChangeSerializer
  25. queryset = UsernameChange.objects
  26. pagination_class = ApiPaginator(12, 4)
  27. def get_queryset(self):
  28. queryset = UsernameChange.objects.select_related('user', 'changed_by')
  29. user = self.request.query_params.get('user', None)
  30. if user is not None:
  31. try:
  32. queryset = queryset.filter(user_id=int(user))
  33. except (ValueError, TypeError):
  34. queryset = queryset.none()
  35. if self.request.query_params.get('search'):
  36. search_phrase = self.request.query_params.get('search').strip()
  37. if search_phrase:
  38. queryset = queryset.filter(
  39. Q(changed_by_username__istartswith=search_phrase) |
  40. Q(new_username__istartswith=search_phrase) |
  41. Q(old_username__istartswith=search_phrase))
  42. return queryset.order_by('-id')