activation.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. ACTIVATION_REQUIRED_USER,
  10. ACTIVATION_REQUIRED_ADMIN)
  11. from misago.users.tokens import (make_activation_token,
  12. is_activation_token_valid)
  13. class ActivationStopped(Exception):
  14. pass
  15. class ActivationError(Exception):
  16. pass
  17. @deny_authenticated
  18. @deny_banned_ips
  19. def activate_by_token(request, user_id, token):
  20. User = get_user_model()
  21. inactive_user = get_object_or_404(User.objects, pk=user_id)
  22. try:
  23. if not inactive_user.requires_activation:
  24. message = _("%(username)s, your account is already active.")
  25. message = message % {'username': inactive_user.username}
  26. raise ActivationStopped(message)
  27. if inactive_user.requires_activation == ACTIVATION_REQUIRED_ADMIN:
  28. message = _("%(username)s, your account can be activated "
  29. "only by one ofthe administrators.")
  30. message = message % {'username': inactive_user.username}
  31. raise ActivationStopped(message)
  32. if not is_activation_token_valid(inactive_user, token):
  33. message = _("%(username)s, your activation link is invalid. "
  34. "Try again or request new activation message.")
  35. message = message % {'username': inactive_user.username}
  36. raise ActivationError(message)
  37. except ActivationStopped as e:
  38. messages.info(request, e.args[0])
  39. return redirect('misago:index')
  40. except ActivationError as e:
  41. messages.error(request, e.args[0])
  42. return redirect('misago:index')
  43. inactive_user.requires_activation = ACTIVATION_REQUIRED_NONE
  44. inactive_user.save(update_fields=['requires_activation'])
  45. message = _("%(username)s, your account has been activated!")
  46. message = message % {'username': inactive_user.username}
  47. messages.success(request, message)
  48. return redirect(settings.LOGIN_URL)