create.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 ugettext 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. UserModel = get_user_model()
  16. @csrf_protect
  17. def create_endpoint(request):
  18. if settings.account_activation == 'closed':
  19. raise PermissionDenied(_("New users registrations are currently closed."))
  20. form = RegisterForm(
  21. request.data,
  22. request=request,
  23. agreements=Agreement.objects.get_agreements(),
  24. )
  25. try:
  26. if form.is_valid():
  27. captcha.test_request(request)
  28. except ValidationError as e:
  29. form.add_error('captcha', e)
  30. if not form.is_valid():
  31. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  32. activation_kwargs = {}
  33. if settings.account_activation == 'user':
  34. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_USER}
  35. elif settings.account_activation == 'admin':
  36. activation_kwargs = {'requires_activation': UserModel.ACTIVATION_ADMIN}
  37. try:
  38. new_user = UserModel.objects.create_user(
  39. form.cleaned_data['username'],
  40. form.cleaned_data['email'],
  41. form.cleaned_data['password'],
  42. create_audit_trail=True,
  43. joined_from_ip=request.user_ip,
  44. set_default_avatar=True,
  45. **activation_kwargs
  46. )
  47. except IntegrityError:
  48. return Response(
  49. {
  50. '__all__': _("Please try resubmitting the form.")
  51. },
  52. status=status.HTTP_400_BAD_REQUEST,
  53. )
  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))