activation.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from django.contrib import messages
  2. from django.contrib.auth import get_user_model
  3. from django.http import Http404
  4. from django.shortcuts import get_object_or_404, redirect, render
  5. from django.utils.translation import ugettext as _
  6. from misago.conf import settings
  7. from misago.core.mail import mail_user
  8. from misago.users.bans import get_user_ban
  9. from misago.users.decorators import deny_authenticated, deny_banned_ips
  10. from misago.users.forms.auth import ResendActivationForm
  11. from misago.users.models import ACTIVATION_REQUIRED_NONE
  12. from misago.users.tokens import (make_activation_token,
  13. is_activation_token_valid)
  14. def activation_view(f):
  15. @deny_authenticated
  16. @deny_banned_ips
  17. def decorator(*args, **kwargs):
  18. return f(*args, **kwargs)
  19. return decorator
  20. @activation_view
  21. def request_activation(request):
  22. form = ResendActivationForm()
  23. if request.method == 'POST':
  24. form = ResendActivationForm(request.POST)
  25. if form.is_valid():
  26. requesting_user = form.user_cache
  27. request.session['activation_sent_to'] = requesting_user.pk
  28. mail_subject = _("Account activation on %(forum_title)s forums")
  29. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  30. activation_token = make_activation_token(requesting_user)
  31. mail_user(
  32. request, requesting_user, mail_subject,
  33. 'misago/emails/activation/by_user',
  34. {'activation_token': activation_token})
  35. return redirect('misago:activation_sent')
  36. return render(request, 'misago/activation/request.html',
  37. {'form': form})
  38. @activation_view
  39. def activation_sent(request):
  40. requesting_user_pk = request.session.get('activation_sent_to')
  41. if not requesting_user_pk:
  42. raise Http404()
  43. User = get_user_model()
  44. requesting_user = get_object_or_404(User.objects, pk=requesting_user_pk)
  45. return render(request, 'misago/activation/sent.html',
  46. {'requesting_user': requesting_user})
  47. class ActivationStopped(Exception):
  48. pass
  49. class ActivationError(Exception):
  50. pass
  51. @activation_view
  52. def activate_by_token(request, user_id, token):
  53. User = get_user_model()
  54. inactive_user = get_object_or_404(User.objects, pk=user_id)
  55. try:
  56. if not inactive_user.requires_activation:
  57. message = _("%(username)s, your account is already active.")
  58. message = message % {'username': inactive_user.username}
  59. raise ActivationStopped(message)
  60. if inactive_user.requires_activation_by_admin:
  61. message = _("%(username)s, your account can be activated "
  62. "only by one of the administrators.")
  63. message = message % {'username': inactive_user.username}
  64. raise ActivationStopped(message)
  65. if get_user_ban(inactive_user):
  66. message = _("%(username)s, your account is banned "
  67. "and can't be activated.")
  68. message = message % {'username': inactive_user.username}
  69. raise ActivationError(message)
  70. if not is_activation_token_valid(inactive_user, token):
  71. message = _("%(username)s, your activation link is invalid. "
  72. "Try again or request new activation message.")
  73. message = message % {'username': inactive_user.username}
  74. raise ActivationError(message)
  75. except ActivationStopped as e:
  76. messages.info(request, e.args[0])
  77. return redirect('misago:index')
  78. except ActivationError as e:
  79. messages.error(request, e.args[0])
  80. return redirect('misago:request_activation')
  81. inactive_user.requires_activation = ACTIVATION_REQUIRED_NONE
  82. inactive_user.save(update_fields=['requires_activation'])
  83. message = _("%(username)s, your account has been activated!")
  84. message = message % {'username': inactive_user.username}
  85. messages.success(request, message)
  86. return redirect(settings.LOGIN_URL)