activation.py 2.2 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 gettext 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(
  19. {"SEND_ACTIVATION_API": reverse("misago:api:send-activation")}
  20. )
  21. return render(request, "misago/activation/request.html")
  22. class ActivationStopped(Exception):
  23. pass
  24. class ActivationError(Exception):
  25. pass
  26. @activation_view
  27. def activate_by_token(request, pk, token):
  28. inactive_user = get_object_or_404(UserModel, pk=pk, is_active=True)
  29. try:
  30. if not inactive_user.requires_activation:
  31. message = _("%(user)s, your account is already active.")
  32. raise ActivationStopped(message % {"user": inactive_user.username})
  33. if not is_activation_token_valid(inactive_user, token):
  34. message = _(
  35. "%(user)s, your activation link is invalid. "
  36. "Try again or request new activation link."
  37. )
  38. raise ActivationError(message % {"user": inactive_user.username})
  39. ban = get_user_ban(inactive_user, request.cache_versions)
  40. if ban:
  41. raise Banned(ban)
  42. except ActivationStopped as e:
  43. return render(request, "misago/activation/stopped.html", {"message": e.args[0]})
  44. except ActivationError as e:
  45. return render(
  46. request, "misago/activation/error.html", {"message": e.args[0]}, status=400
  47. )
  48. inactive_user.requires_activation = UserModel.ACTIVATION_NONE
  49. inactive_user.save(update_fields=["requires_activation"])
  50. message = _("%(user)s, your account has been activated!")
  51. return render(
  52. request,
  53. "misago/activation/done.html",
  54. {"message": message % {"user": inactive_user.username}},
  55. )