usernamechanges.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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.shortcuts import get_object_or_404
  5. from django.utils.translation import gettext as _
  6. from rest_framework import viewsets
  7. from rest_framework.response import Response
  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. User = get_user_model()
  13. class UsernameChangesViewSetPermission(BasePermission):
  14. def has_permission(self, request, view):
  15. try:
  16. user_pk = int(request.query_params.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(
  23. _("You don't have permission to see other users name history.")
  24. )
  25. return True
  26. class UsernameChangesViewSet(viewsets.GenericViewSet):
  27. permission_classes = (UsernameChangesViewSetPermission,)
  28. serializer_class = UsernameChangeSerializer
  29. def get_queryset(self):
  30. queryset = UsernameChange.objects
  31. if self.request.query_params.get("user"):
  32. user_pk = get_int_or_404(self.request.query_params.get("user"))
  33. queryset = get_object_or_404(User.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.query_params.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)