activation.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django.contrib.auth import get_user_model
  2. from django.shortcuts import get_object_or_404, render
  3. from django.urls import reverse
  4. from django.utils.translation import ugettext as _
  5. from misago.core.exceptions import Banned
  6. from misago.users.bans import get_user_ban
  7. from misago.users.decorators import deny_authenticated, deny_banned_ips
  8. from misago.users.tokens import is_activation_token_valid
  9. UserModel = get_user_model()
  10. def activation_view(f):
  11. @deny_authenticated
  12. @deny_banned_ips
  13. def decorator(*args, **kwargs):
  14. return f(*args, **kwargs)
  15. return decorator
  16. @activation_view
  17. def request_activation(request):
  18. request.frontend_context.update({'SEND_ACTIVATION_API': reverse('misago:api:send-activation')})
  19. return render(request, 'misago/activation/request.html')
  20. class ActivationStopped(Exception):
  21. pass
  22. class ActivationError(Exception):
  23. pass
  24. @activation_view
  25. def activate_by_token(request, pk, token):
  26. inactive_user = get_object_or_404(UserModel, pk=pk, is_active=True)
  27. try:
  28. if not inactive_user.requires_activation:
  29. message = _("%(user)s, your account is already active.")
  30. raise ActivationStopped(message % {'user': inactive_user.username})
  31. if not is_activation_token_valid(inactive_user, token):
  32. message = _(
  33. "%(user)s, your activation link is invalid. "
  34. "Try again or request new activation link."
  35. )
  36. raise ActivationError(message % {'user': inactive_user.username})
  37. ban = get_user_ban(inactive_user)
  38. if ban:
  39. raise Banned(ban)
  40. except ActivationStopped as e:
  41. return render(request, 'misago/activation/stopped.html', {
  42. 'message': e.args[0],
  43. })
  44. except ActivationError as e:
  45. return render(
  46. request, 'misago/activation/error.html', {
  47. 'message': e.args[0],
  48. }, status=400
  49. )
  50. inactive_user.requires_activation = UserModel.ACTIVATION_NONE
  51. inactive_user.save(update_fields=['requires_activation'])
  52. message = _("%(user)s, your account has been activated!")
  53. return render(
  54. request, 'misago/activation/done.html', {
  55. 'message': message % {
  56. 'user': inactive_user.username
  57. },
  58. }
  59. )