activation.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.contrib import messages
  2. from django.contrib.auth import get_user_model
  3. from django.http import Http404
  4. from django.shortcuts import get_object_or_404, redirect, render
  5. from django.utils.translation import ugettext as _
  6. from misago.conf import settings
  7. from misago.users.decorators import deny_authenticated, deny_banned_ips
  8. from misago.users.models import ACTIVATION_REQUIRED_NONE
  9. from misago.users.tokens import (make_activation_token,
  10. is_activation_token_valid)
  11. class ActivationStopped(Exception):
  12. pass
  13. class ActivationError(Exception):
  14. pass
  15. @deny_authenticated
  16. @deny_banned_ips
  17. def activate_by_token(request, user_id, token):
  18. User = get_user_model()
  19. inactive_user = get_object_or_404(User.objects, pk=user_id)
  20. try:
  21. if not inactive_user.requires_activation:
  22. message = _("%(username)s, your account is already active.")
  23. message = message % {'username': inactive_user.username}
  24. raise ActivationStopped(message)
  25. if inactive_user.requires_activation_by_admin:
  26. message = _("%(username)s, your account can be activated "
  27. "only by one ofthe administrators.")
  28. message = message % {'username': inactive_user.username}
  29. raise ActivationStopped(message)
  30. if not is_activation_token_valid(inactive_user, token):
  31. message = _("%(username)s, your activation link is invalid. "
  32. "Try again or request new activation message.")
  33. message = message % {'username': inactive_user.username}
  34. raise ActivationError(message)
  35. except ActivationStopped as e:
  36. messages.info(request, e.args[0])
  37. return redirect('misago:index')
  38. except ActivationError as e:
  39. messages.error(request, e.args[0])
  40. return redirect('misago:index')
  41. inactive_user.requires_activation = ACTIVATION_REQUIRED_NONE
  42. inactive_user.save(update_fields=['requires_activation'])
  43. message = _("%(username)s, your account has been activated!")
  44. message = message % {'username': inactive_user.username}
  45. messages.success(request, message)
  46. return redirect(settings.LOGIN_URL)