username.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.core.exceptions import PermissionDenied
  2. from django.db import IntegrityError
  3. from django.utils.translation import ugettext as _
  4. from rest_framework import status
  5. from rest_framework.response import Response
  6. from misago.conf import settings
  7. from misago.users.namechanges import UsernameChanges
  8. from misago.users.forms.rename import ChangeUsernameForm
  9. def username_endpoint(request):
  10. if request.method == 'POST':
  11. return change_username(request)
  12. else:
  13. return options_response(get_username_options(request.user))
  14. def get_username_options(user):
  15. options = UsernameChanges(user)
  16. return {
  17. 'changes_left': options.left,
  18. 'next_on': options.next_on,
  19. 'length_min': settings.username_length_min,
  20. 'length_max': settings.username_length_max,
  21. }
  22. def options_response(options):
  23. if options['next_on']:
  24. options['next_on'] = options['next_on'].isoformat()
  25. return Response(options)
  26. def change_username(request):
  27. options = get_username_options(request.user)
  28. if not options['changes_left']:
  29. return Response({
  30. 'detail': _("You can't change your username now."),
  31. 'options': options
  32. },
  33. status=status.HTTP_400_BAD_REQUEST)
  34. form = ChangeUsernameForm(request.data, user=request.user)
  35. if form.is_valid():
  36. try:
  37. form.change_username(changed_by=request.user)
  38. return Response({
  39. 'username': request.user.username,
  40. 'slug': request.user.slug,
  41. 'options': get_username_options(request.user)
  42. })
  43. except IntegrityError:
  44. return Response({
  45. 'detail': _("Error changing username. Please try again."),
  46. 'options': options
  47. },
  48. status=status.HTTP_400_BAD_REQUEST)
  49. else:
  50. return Response({'detail': form.non_field_errors()[0]},
  51. status=status.HTTP_400_BAD_REQUEST)