create.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from django.contrib.auth import authenticate, get_user_model, login
  2. from django.core.exceptions import PermissionDenied
  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 import forms
  9. from misago.core.mail import mail_user
  10. from misago.users import captcha
  11. from misago.users.bans import ban_ip
  12. from misago.users.forms.register import RegisterForm
  13. from misago.users.models import (ACTIVATION_REQUIRED_USER,
  14. ACTIVATION_REQUIRED_ADMIN)
  15. from misago.users.serializers import AuthenticatedUserSerializer
  16. from misago.users.tokens import make_activation_token
  17. from misago.users.validators import validate_new_registration
  18. @csrf_protect
  19. def create_endpoint(request):
  20. if settings.account_activation == 'closed':
  21. raise PermissionDenied(
  22. _("New users registrations are currently closed."))
  23. form = RegisterForm(request.data)
  24. try:
  25. captcha.test_request(request)
  26. except forms.ValidationError as e:
  27. form.add_error('captcha', e)
  28. if not form.is_valid():
  29. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  30. captcha.reset_session(request.session)
  31. try:
  32. validate_new_registration(
  33. request.user_ip,
  34. form.cleaned_data['username'],
  35. form.cleaned_data['email'])
  36. except PermissionDenied:
  37. staff_message = _("This ban was automatically imposed on "
  38. "%(date)s due to denied registration attempt.")
  39. message_formats = {'date': date_format(timezone.now())}
  40. staff_message = staff_message % message_formats
  41. ban_ip(
  42. request.user_ip,
  43. staff_message=staff_message,
  44. length={'days': 14}
  45. )
  46. raise PermissionDenied(
  47. _("Your IP address is banned from registering on this site."))
  48. activation_kwargs = {}
  49. if settings.account_activation == 'user':
  50. activation_kwargs = {
  51. 'requires_activation': ACTIVATION_REQUIRED_USER
  52. }
  53. elif settings.account_activation == 'admin':
  54. activation_kwargs = {
  55. 'requires_activation': ACTIVATION_REQUIRED_ADMIN
  56. }
  57. User = get_user_model()
  58. new_user = User.objects.create_user(form.cleaned_data['username'],
  59. form.cleaned_data['email'],
  60. form.cleaned_data['password'],
  61. joined_from_ip=request.user_ip,
  62. set_default_avatar=True,
  63. **activation_kwargs)
  64. mail_subject = _("Welcome on %(forum_title)s forums!")
  65. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  66. if settings.account_activation == 'none':
  67. authenticated_user = authenticate(
  68. username=new_user.email,
  69. password=form.cleaned_data['password'])
  70. login(request, authenticated_user)
  71. mail_user(request, new_user, mail_subject,
  72. 'misago/emails/register/complete')
  73. return Response({
  74. 'activation': 'active',
  75. 'username': new_user.username,
  76. 'email': new_user.email
  77. })
  78. else:
  79. activation_token = make_activation_token(new_user)
  80. activation_by_admin = new_user.requires_activation_by_admin
  81. activation_by_user = new_user.requires_activation_by_user
  82. mail_user(
  83. request, new_user, mail_subject,
  84. 'misago/emails/register/inactive',
  85. {
  86. 'activation_token': activation_token,
  87. 'activation_by_admin': activation_by_admin,
  88. 'activation_by_user': activation_by_user,
  89. })
  90. if activation_by_admin:
  91. activation_method = 'by_admin'
  92. else:
  93. activation_method = 'by_user'
  94. return Response({
  95. 'activation': activation_method,
  96. 'username': new_user.username,
  97. 'email': new_user.email
  98. })