activation.py 2.7 KB

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