username.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from rest_framework import status
  2. from rest_framework.response import Response
  3. from django.db import IntegrityError
  4. from django.utils.translation import gettext as _
  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(
  15. request.settings, request.user, request.user_acl
  16. )
  17. def options_response(options):
  18. if options['next_on']:
  19. options['next_on'] = options['next_on'].isoformat()
  20. return Response(options)
  21. def change_username(request):
  22. options = get_username_options_from_request(request)
  23. if not options['changes_left']:
  24. return Response(
  25. {
  26. 'detail': _("You can't change your username now."),
  27. 'options': options
  28. },
  29. status=status.HTTP_400_BAD_REQUEST
  30. )
  31. serializer = ChangeUsernameSerializer(
  32. data=request.data,
  33. context={'settings': request.settings, 'user': request.user},
  34. )
  35. if serializer.is_valid():
  36. try:
  37. serializer.change_username(changed_by=request.user)
  38. updated_options = get_username_options_from_request(request)
  39. if updated_options['next_on']:
  40. updated_options['next_on'] = updated_options['next_on'].isoformat()
  41. return Response({
  42. 'username': request.user.username,
  43. 'slug': request.user.slug,
  44. 'options': updated_options,
  45. })
  46. except IntegrityError:
  47. return Response(
  48. {
  49. 'detail': _("Error changing username. Please try again."),
  50. },
  51. status=status.HTTP_400_BAD_REQUEST
  52. )
  53. else:
  54. return Response(
  55. {
  56. 'detail': serializer.errors['non_field_errors'][0]
  57. },
  58. status=status.HTTP_400_BAD_REQUEST
  59. )
  60. def moderate_username_endpoint(request, profile):
  61. if request.method == 'POST':
  62. serializer = ChangeUsernameSerializer(
  63. data=request.data,
  64. context={'settings': request.settings, 'user': profile},
  65. )
  66. if serializer.is_valid():
  67. try:
  68. serializer.change_username(changed_by=request.user)
  69. return Response({
  70. 'username': profile.username,
  71. 'slug': profile.slug,
  72. })
  73. except IntegrityError:
  74. return Response(
  75. {
  76. 'detail': _("Error changing username. Please try again."),
  77. },
  78. status=status.HTTP_400_BAD_REQUEST
  79. )
  80. else:
  81. return Response(
  82. {
  83. 'detail': serializer.errors['non_field_errors'][0]
  84. },
  85. status=status.HTTP_400_BAD_REQUEST
  86. )
  87. else:
  88. return Response({
  89. 'length_min': request.settings.username_length_min,
  90. 'length_max': request.settings.username_length_max,
  91. })