create.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from rest_framework import status
  2. from rest_framework.response import Response
  3. from django.contrib.auth import authenticate, get_user_model, login
  4. from django.core.exceptions import PermissionDenied, ValidationError
  5. from django.db import IntegrityError
  6. from django.utils.translation import gettext as _
  7. from django.views.decorators.csrf import csrf_protect
  8. from misago.conf import settings
  9. from misago.legal.models import Agreement
  10. from misago.users import captcha
  11. from misago.users.forms.register import RegisterForm
  12. from misago.users.registration import (
  13. get_registration_result_json, save_user_agreements, send_welcome_email
  14. )
  15. from misago.users.setupnewuser import setup_new_user
  16. UserModel = get_user_model()
  17. @csrf_protect
  18. def create_endpoint(request):
  19. if settings.account_activation == 'closed':
  20. raise PermissionDenied(_("New users registrations are currently closed."))
  21. form = RegisterForm(
  22. request.data,
  23. request=request,
  24. agreements=Agreement.objects.get_agreements(),
  25. )
  26. try:
  27. if form.is_valid():
  28. captcha.test_request(request)
  29. except ValidationError as e:
  30. form.add_error('captcha', e)
  31. if not form.is_valid():
  32. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  33. activation_kwargs = {}
  34. if settings.account_activation == 'user':
  35. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_USER}
  36. elif settings.account_activation == 'admin':
  37. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_ADMIN}
  38. try:
  39. new_user = UserModel.objects.create_user(
  40. form.cleaned_data['username'],
  41. form.cleaned_data['email'],
  42. form.cleaned_data['password'],
  43. joined_from_ip=request.user_ip,
  44. **activation_kwargs
  45. )
  46. except IntegrityError:
  47. return Response(
  48. {
  49. '__all__': _("Please try resubmitting the form.")
  50. },
  51. status=status.HTTP_400_BAD_REQUEST,
  52. )
  53. setup_new_user(request.settings, new_user)
  54. save_user_agreements(new_user, form)
  55. send_welcome_email(request, new_user)
  56. if new_user.requires_activation == UserModel.ACTIVATION_NONE:
  57. authenticated_user = authenticate(
  58. username=new_user.email, password=form.cleaned_data['password']
  59. )
  60. login(request, authenticated_user)
  61. return Response(get_registration_result_json(new_user))