username.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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.conf import settings
  6. from misago.users.namechanges import get_username_options
  7. from misago.users.serializers import ChangeUsernameSerializer
  8. def username_endpoint(request):
  9. if request.method == 'POST':
  10. return change_username(request)
  11. else:
  12. options = get_username_options_from_request(request)
  13. return options_response(options)
  14. def get_username_options_from_request(request):
  15. return get_username_options(
  16. settings, request.user, request.user_acl
  17. )
  18. def options_response(options):
  19. if options['next_on']:
  20. options['next_on'] = options['next_on'].isoformat()
  21. return Response(options)
  22. def change_username(request):
  23. options = get_username_options_from_request(request)
  24. if not options['changes_left']:
  25. return Response(
  26. {
  27. 'detail': _("You can't change your username now."),
  28. 'options': options
  29. },
  30. status=status.HTTP_400_BAD_REQUEST
  31. )
  32. serializer = ChangeUsernameSerializer(
  33. data=request.data, context={'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(data=request.data, context={'user': profile})
  63. if serializer.is_valid():
  64. try:
  65. serializer.change_username(changed_by=request.user)
  66. return Response({
  67. 'username': profile.username,
  68. 'slug': profile.slug,
  69. })
  70. except IntegrityError:
  71. return Response(
  72. {
  73. 'detail': _("Error changing username. Please try again."),
  74. },
  75. status=status.HTTP_400_BAD_REQUEST
  76. )
  77. else:
  78. return Response(
  79. {
  80. 'detail': serializer.errors['non_field_errors'][0]
  81. },
  82. status=status.HTTP_400_BAD_REQUEST
  83. )
  84. else:
  85. return Response({
  86. 'length_min': settings.username_length_min,
  87. 'length_max': settings.username_length_max,
  88. })