create.py 2.4 KB

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