create.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from rest_framework.response import Response
  2. from django.contrib.auth import authenticate, get_user_model, login
  3. from django.core.exceptions import PermissionDenied, ValidationError
  4. from django.db import IntegrityError
  5. from django.utils.translation import ugettext as _
  6. from django.views.decorators.csrf import csrf_protect
  7. from misago.conf import settings
  8. from misago.core.exceptions import Banned
  9. from misago.core.mail import mail_user
  10. from misago.users.bans import get_ip_ban
  11. from misago.users.serializers import RegisterUserSerializer
  12. from misago.users.tokens import make_activation_token
  13. UserModel = get_user_model()
  14. @csrf_protect
  15. def create_endpoint(request):
  16. if settings.account_activation == 'closed':
  17. raise PermissionDenied(_("New users registrations are currently closed."))
  18. ban = get_ip_ban(request.user_ip, registration_only=True)
  19. if ban:
  20. raise Banned(ban)
  21. serializer = RegisterUserSerializer(
  22. data=request.data,
  23. context={'request': request},
  24. )
  25. serializer.is_valid(raise_exception=True)
  26. activation_kwargs = {}
  27. if settings.account_activation == 'user':
  28. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_USER}
  29. elif settings.account_activation == 'admin':
  30. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_ADMIN}
  31. try:
  32. new_user = UserModel.objects.create_user(
  33. serializer.validated_data['username'],
  34. serializer.validated_data['email'],
  35. serializer.validated_data['password'],
  36. joined_from_ip=request.user_ip,
  37. set_default_avatar=True,
  38. **activation_kwargs
  39. )
  40. except IntegrityError:
  41. return Response(
  42. {
  43. 'detail': _("Please try resubmitting the form."),
  44. },
  45. status=400,
  46. )
  47. mail_subject = _("Welcome on %(forum_name)s forums!")
  48. mail_subject = mail_subject % {'forum_name': settings.forum_name}
  49. if settings.account_activation == 'none':
  50. authenticated_user = authenticate(
  51. username=new_user.email,
  52. password=serializer.validated_data['password'],
  53. )
  54. login(request, authenticated_user)
  55. mail_user(request, new_user, mail_subject, 'misago/emails/register/complete')
  56. return Response({
  57. 'activation': None,
  58. 'username': new_user.username,
  59. 'email': new_user.email
  60. })
  61. else:
  62. activation_token = make_activation_token(new_user)
  63. activation_by_admin = new_user.requires_activation_by_admin
  64. activation_by_user = new_user.requires_activation_by_user
  65. mail_user(
  66. request, new_user, mail_subject, 'misago/emails/register/inactive', {
  67. 'activation_token': activation_token,
  68. 'activation_by_admin': activation_by_admin,
  69. 'activation_by_user': activation_by_user,
  70. }
  71. )
  72. if activation_by_admin:
  73. activation_method = 'admin'
  74. else:
  75. activation_method = 'user'
  76. return Response({
  77. 'activation': activation_method,
  78. 'username': new_user.username,
  79. 'email': new_user.email
  80. })