create.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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.mail import mail_user
  9. from misago.users.serializers import RegisterUserSerializer
  10. from misago.users.tokens import make_activation_token
  11. UserModel = get_user_model()
  12. @csrf_protect
  13. def create_endpoint(request):
  14. if settings.account_activation == 'closed':
  15. raise PermissionDenied(_("New users registrations are currently closed."))
  16. serializer = RegisterUserSerializer(
  17. data=request.data,
  18. context={'request': request},
  19. )
  20. serializer.is_valid(raise_exception=True)
  21. activation_kwargs = {}
  22. if settings.account_activation == 'user':
  23. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_USER}
  24. elif settings.account_activation == 'admin':
  25. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_ADMIN}
  26. try:
  27. new_user = UserModel.objects.create_user(
  28. serializer.validated_data['username'],
  29. serializer.validated_data['email'],
  30. serializer.validated_data['password'],
  31. joined_from_ip=request.user_ip,
  32. set_default_avatar=True,
  33. **activation_kwargs
  34. )
  35. except IntegrityError:
  36. return Response(
  37. {
  38. 'detail': _("Please try resubmitting the form."),
  39. },
  40. status=400,
  41. )
  42. mail_subject = _("Welcome on %(forum_name)s forums!")
  43. mail_subject = mail_subject % {'forum_name': settings.forum_name}
  44. if settings.account_activation == 'none':
  45. authenticated_user = authenticate(
  46. username=new_user.email,
  47. password=serializer.validated_data['password'],
  48. )
  49. login(request, authenticated_user)
  50. mail_user(request, new_user, mail_subject, 'misago/emails/register/complete')
  51. return Response({
  52. 'activation': None,
  53. 'username': new_user.username,
  54. 'email': new_user.email
  55. })
  56. else:
  57. activation_token = make_activation_token(new_user)
  58. activation_by_admin = new_user.requires_activation_by_admin
  59. activation_by_user = new_user.requires_activation_by_user
  60. mail_user(
  61. request, new_user, mail_subject, 'misago/emails/register/inactive', {
  62. 'activation_token': activation_token,
  63. 'activation_by_admin': activation_by_admin,
  64. 'activation_by_user': activation_by_user,
  65. }
  66. )
  67. if activation_by_admin:
  68. activation_method = 'admin'
  69. else:
  70. activation_method = 'user'
  71. return Response({
  72. 'activation': activation_method,
  73. 'username': new_user.username,
  74. 'email': new_user.email
  75. })