username.py 2.8 KB

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