create.py 3.0 KB

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