create.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 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,
  14. save_user_agreements,
  15. send_welcome_email,
  16. )
  17. from misago.users.setupnewuser import setup_new_user
  18. User = get_user_model()
  19. @csrf_protect
  20. def create_endpoint(request):
  21. if request.settings.account_activation == "closed":
  22. raise PermissionDenied(_("New users registrations are currently closed."))
  23. form = RegisterForm(
  24. request.data, request=request, 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 request.settings.account_activation == "user":
  35. activation_kwargs = {"requires_activation": User.ACTIVATION_USER}
  36. elif request.settings.account_activation == "admin":
  37. activation_kwargs = {"requires_activation": User.ACTIVATION_ADMIN}
  38. try:
  39. new_user = User.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. {"__all__": _("Please try resubmitting the form.")},
  49. status=status.HTTP_400_BAD_REQUEST,
  50. )
  51. setup_new_user(request.settings, new_user)
  52. save_user_agreements(new_user, form)
  53. send_welcome_email(request, new_user)
  54. if new_user.requires_activation == User.ACTIVATION_NONE:
  55. authenticated_user = authenticate(
  56. username=new_user.email, password=form.cleaned_data["password"]
  57. )
  58. login(request, authenticated_user)
  59. return Response(get_registration_result_json(new_user))