usernamechanges.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 ..models import UsernameChange
  10. from ..serializers.usernamechange import UsernameChangeSerializer
  11. from .rest_permissions import BasePermission
  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(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(
  32. get_user_model().objects, pk=user_pk).namechanges
  33. if self.request.query_params.get('search'):
  34. search_phrase = self.request.query_params.get('search').strip()
  35. if search_phrase:
  36. queryset = queryset.filter(
  37. Q(changed_by_username__istartswith=search_phrase) |
  38. Q(new_username__istartswith=search_phrase) |
  39. Q(old_username__istartswith=search_phrase)
  40. )
  41. return queryset.select_related('user', 'changed_by').order_by('-id')
  42. def list(self, request):
  43. page = get_int_or_404(request.GET.get('page', 0))
  44. if page == 1:
  45. page = 0 # api allows explicit first page
  46. queryset = self.get_queryset()
  47. list_page = paginate(queryset, page, 12, 4)
  48. data = pagination_dict(list_page)
  49. data.update({
  50. 'results': UsernameChangeSerializer(list_page.object_list, many=True).data
  51. })
  52. return Response(data)