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