username.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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_on': options.next_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_on']:
  22. options['next_on'] = options['next_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. return Response(
  28. {
  29. 'detail': _("You can't change your username now."),
  30. 'options': options,
  31. },
  32. status=400,
  33. )
  34. serializer = ChangeUsernameSerializer(
  35. data=request.data,
  36. context={'user': request.user},
  37. )
  38. if not serializer.is_valid():
  39. return Response(serializer.errors, status=400)
  40. try:
  41. serializer.change_username(changed_by=request.user)
  42. return Response({
  43. 'username': request.user.username,
  44. 'slug': request.user.slug,
  45. 'options': get_username_options(request.user)
  46. })
  47. except IntegrityError:
  48. return Response(
  49. {
  50. 'detail': _("Error changing username. Please try again."),
  51. },
  52. status=400,
  53. )
  54. def moderate_username_endpoint(request, profile):
  55. if request.method == 'POST':
  56. serializer = ChangeUsernameSerializer(data=request.data, context={'user': profile})
  57. if not serializer.is_valid():
  58. return Response({'detail': serializer.errors}, status=400)
  59. try:
  60. serializer.change_username(changed_by=request.user)
  61. return Response({
  62. 'username': profile.username,
  63. 'slug': profile.slug,
  64. })
  65. except IntegrityError:
  66. return Response(
  67. {
  68. 'detail': _("Error changing username. Please try again."),
  69. },
  70. status=400,
  71. )
  72. else:
  73. return Response({
  74. 'length_min': settings.username_length_min,
  75. 'length_max': settings.username_length_max,
  76. })