activation.py 2.3 KB

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