username.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from rest_framework.response import Response
  2. from django.db import IntegrityError
  3. from django.utils.translation import ugettext as _
  4. from misago.conf import settings
  5. from misago.users.namechanges import UsernameChanges
  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. return options_response(get_username_options(request.user))
  12. def get_username_options(user):
  13. options = UsernameChanges(user)
  14. return {
  15. 'changes_left': options.left,
  16. 'next_change_on': options.next_change_on,
  17. 'length_min': settings.username_length_min,
  18. 'length_max': settings.username_length_max,
  19. }
  20. def options_response(options):
  21. if options['next_change_on']:
  22. options['next_change_on'] = options['next_change_on'].isoformat()
  23. return Response(options)
  24. def change_username(request):
  25. options = get_username_options(request.user)
  26. if not options['changes_left']:
  27. if options['next_change_on']:
  28. next_change_on = options['next_change_on'].isoformat()
  29. else:
  30. next_change_on = None
  31. return Response(
  32. {
  33. 'username': [_("You can't change your username at this time.")],
  34. 'next_change_on': next_change_on,
  35. },
  36. status=400,
  37. )
  38. serializer = ChangeUsernameSerializer(
  39. data=request.data,
  40. context={'user': request.user},
  41. )
  42. if not serializer.is_valid():
  43. return Response(serializer.errors, status=400)
  44. try:
  45. serializer.change_username(changed_by=request.user)
  46. return Response({
  47. 'username': request.user.username,
  48. 'slug': request.user.slug,
  49. 'options': get_username_options(request.user)
  50. })
  51. except IntegrityError:
  52. return Response(
  53. {
  54. 'username': [_("Please try again.")],
  55. },
  56. status=400,
  57. )
  58. def moderate_username_endpoint(request, profile):
  59. if request.method == 'POST':
  60. serializer = ChangeUsernameSerializer(data=request.data, context={'user': profile})
  61. if not serializer.is_valid():
  62. return Response(serializer.errors, status=400)
  63. try:
  64. serializer.change_username(changed_by=request.user)
  65. return Response({
  66. 'username': profile.username,
  67. 'slug': profile.slug,
  68. })
  69. except IntegrityError:
  70. return Response(
  71. {
  72. 'username': [_("Please try again.")],
  73. },
  74. status=400,
  75. )
  76. else:
  77. return Response({
  78. 'length_min': settings.username_length_min,
  79. 'length_max': settings.username_length_max,
  80. })