username.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django.db import IntegrityError
  2. from django.utils.translation import gettext as _
  3. from rest_framework import status
  4. from rest_framework.response import Response
  5. from ...namechanges import get_username_options
  6. from ...serializers import ChangeUsernameSerializer
  7. def username_endpoint(request):
  8. if request.method == "POST":
  9. return change_username(request)
  10. options = get_username_options_from_request(request)
  11. return options_response(options)
  12. def get_username_options_from_request(request):
  13. return get_username_options(request.settings, request.user, request.user_acl)
  14. def options_response(options):
  15. if options["next_on"]:
  16. options["next_on"] = options["next_on"].isoformat()
  17. return Response(options)
  18. def change_username(request):
  19. options = get_username_options_from_request(request)
  20. if not options["changes_left"]:
  21. return Response(
  22. {"detail": _("You can't change your username now."), "options": options},
  23. status=status.HTTP_400_BAD_REQUEST,
  24. )
  25. serializer = ChangeUsernameSerializer(
  26. data=request.data, context={"settings": request.settings, "user": request.user}
  27. )
  28. if not serializer.is_valid():
  29. return Response(
  30. {"detail": serializer.errors["non_field_errors"][0]},
  31. status=status.HTTP_400_BAD_REQUEST,
  32. )
  33. try:
  34. serializer.change_username(changed_by=request.user)
  35. updated_options = get_username_options_from_request(request)
  36. if updated_options["next_on"]:
  37. updated_options["next_on"] = updated_options["next_on"].isoformat()
  38. return Response(
  39. {
  40. "username": request.user.username,
  41. "slug": request.user.slug,
  42. "options": updated_options,
  43. }
  44. )
  45. except IntegrityError:
  46. return Response(
  47. {"detail": _("Error changing username. Please try again.")},
  48. status=status.HTTP_400_BAD_REQUEST,
  49. )
  50. def moderate_username_endpoint(request, profile):
  51. if request.method == "POST":
  52. serializer = ChangeUsernameSerializer(
  53. data=request.data, context={"settings": request.settings, "user": profile}
  54. )
  55. if not serializer.is_valid():
  56. return Response(
  57. {"detail": serializer.errors["non_field_errors"][0]},
  58. status=status.HTTP_400_BAD_REQUEST,
  59. )
  60. try:
  61. serializer.change_username(changed_by=request.user)
  62. return Response({"username": profile.username, "slug": profile.slug})
  63. except IntegrityError:
  64. return Response(
  65. {"detail": _("Error changing username. Please try again.")},
  66. status=status.HTTP_400_BAD_REQUEST,
  67. )
  68. return Response(
  69. {
  70. "length_min": request.settings.username_length_min,
  71. "length_max": request.settings.username_length_max,
  72. }
  73. )