activation.py 2.2 KB

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