register.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from django.contrib import messages
  2. from django.contrib.auth import authenticate, get_user_model, login
  3. from django.core.exceptions import PermissionDenied
  4. from django.http import Http404
  5. from django.shortcuts import get_object_or_404, redirect, render
  6. from django.utils import timezone
  7. from django.utils.formats import date_format
  8. from django.utils.translation import ugettext as _
  9. from django.views.decorators.cache import never_cache
  10. from django.views.decorators.debug import sensitive_post_parameters
  11. from misago.conf import settings
  12. from misago.core.captcha import add_captcha_to_form
  13. from misago.core.mail import mail_user
  14. from misago.users.bans import ban_ip
  15. from misago.users.decorators import deny_authenticated, deny_banned_ips
  16. from misago.users.forms.register import RegisterForm
  17. from misago.users.models import (ACTIVATION_REQUIRED_USER,
  18. ACTIVATION_REQUIRED_ADMIN)
  19. from misago.users.tokens import make_activation_token
  20. from misago.users.validators import validate_new_registration
  21. def register_decorator(f):
  22. def decorator(request):
  23. if settings.account_activation == 'disabled':
  24. return register_disabled(request)
  25. else:
  26. return f(request)
  27. return decorator
  28. @sensitive_post_parameters("email", "password")
  29. @never_cache
  30. @deny_authenticated
  31. @deny_banned_ips
  32. @register_decorator
  33. def register(request):
  34. SecuredForm = add_captcha_to_form(RegisterForm, request)
  35. form = SecuredForm()
  36. if request.method == 'POST':
  37. form = SecuredForm(request.POST)
  38. if form.is_valid():
  39. try:
  40. validate_new_registration(
  41. request.user.ip,
  42. form.cleaned_data['username'],
  43. form.cleaned_data['email'])
  44. except PermissionDenied as e:
  45. staff_message = _("This ban was automatically imposed on "
  46. "%(date)s due to denied register attempt.")
  47. message_formats = {'date': date_format(timezone.now())}
  48. staff_message = staff_message % message_formats
  49. ban_ip(request.user.ip,
  50. staff_message=staff_message,
  51. length={'days': 1})
  52. raise e
  53. activation_kwargs = {}
  54. if settings.account_activation == 'user':
  55. activation_kwargs = {
  56. 'requires_activation': ACTIVATION_REQUIRED_USER
  57. }
  58. elif settings.account_activation == 'admin':
  59. activation_kwargs = {
  60. 'requires_activation': ACTIVATION_REQUIRED_ADMIN
  61. }
  62. User = get_user_model()
  63. new_user = User.objects.create_user(form.cleaned_data['username'],
  64. form.cleaned_data['email'],
  65. form.cleaned_data['password'],
  66. set_default_avatar=True,
  67. **activation_kwargs)
  68. mail_subject = _("Welcome on %(forum_title)s forums!")
  69. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  70. if settings.account_activation == 'none':
  71. authenticated_user = authenticate(
  72. username=new_user.email,
  73. password=form.cleaned_data['password'])
  74. login(request, authenticated_user)
  75. welcome_message = _("Welcome aboard, %(user)s!")
  76. welcome_message = welcome_message % {'user': new_user.username}
  77. messages.success(request, welcome_message)
  78. mail_user(request, new_user, mail_subject,
  79. 'misago/emails/register/complete')
  80. return redirect(settings.LOGIN_REDIRECT_URL)
  81. else:
  82. activation_token = make_activation_token(new_user)
  83. activation_by_admin = new_user.requires_activation_by_admin
  84. activation_by_user = new_user.requires_activation_by_user
  85. mail_user(
  86. request, new_user, mail_subject,
  87. 'misago/emails/register/inactive',
  88. {
  89. 'activation_token': activation_token,
  90. 'activation_by_admin': activation_by_admin,
  91. 'activation_by_user': activation_by_user,
  92. })
  93. request.session['registered_user'] = new_user.pk
  94. return redirect('misago:register_completed')
  95. return render(request, 'misago/register/form.html', {'form': form})
  96. def register_disabled(request):
  97. return render(request, 'misago/register/disabled.html')
  98. def register_completed(request):
  99. """
  100. If user needs to activate his account, we display him page with message
  101. """
  102. registered_user_pk = request.session.get('registered_user')
  103. if not registered_user_pk:
  104. raise Http404()
  105. registered_user = get_object_or_404(get_user_model().objects,
  106. pk=registered_user_pk)
  107. if not registered_user.requires_activation:
  108. return redirect('misago:index')
  109. activation_by_admin = registered_user.requires_activation_by_admin
  110. activation_by_user = registered_user.requires_activation_by_user
  111. return render(
  112. request,
  113. 'misago/register/completed.html',
  114. {
  115. 'activation_by_admin': activation_by_admin,
  116. 'activation_by_user': activation_by_user,
  117. 'registered_user': registered_user,
  118. })