views.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from django.core.exceptions import ValidationError
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext as _
  5. from misago.authn.decorators import block_guest
  6. from misago.forms import FormLayout
  7. from misago.messages import Message
  8. from misago.usercp.template import RequestContext
  9. from misago.usercp.credentials.forms import CredentialsChangeForm
  10. from misago.views import error404
  11. from misago.utils import get_random_string
  12. @block_guest
  13. def credentials(request):
  14. message = request.messages.get_message('usercp_credentials')
  15. if request.method == 'POST':
  16. form = CredentialsChangeForm(request.POST, request=request)
  17. if form.is_valid():
  18. token = get_random_string(12)
  19. request.user.email_user(
  20. request,
  21. 'users/new_credentials',
  22. _("Activate new Sign-In Credentials"),
  23. {'token': token}
  24. )
  25. request.session['new_credentials'] = {
  26. 'token': token,
  27. 'email_hash': request.user.email_hash,
  28. 'new_email': form.cleaned_data['new_email'],
  29. 'new_password': form.cleaned_data['new_password'],
  30. }
  31. if form.cleaned_data['new_email']:
  32. request.user.email = form.cleaned_data['new_email']
  33. request.messages.set_flash(Message(_("We have sent e-mail message to your new e-mail address with link you have to click to confirm change of your sign-in credentials. This link will be valid only for duration of this session, do not sign out until you confirm change!")), 'success', 'usercp_credentials')
  34. else:
  35. request.messages.set_flash(Message(_("We have sent e-mail message to your e-mail address with link you have to click to confirm change of your sign-in credentials. This link will be valid only for duration of this session, do not sign out until you confirm change!")), 'success', 'usercp_credentials')
  36. return redirect(reverse('usercp_credentials'))
  37. message = Message(form.non_field_errors()[0], 'error')
  38. else:
  39. form = CredentialsChangeForm(request=request)
  40. return request.theme.render_to_response('usercp/credentials.html',
  41. context_instance=RequestContext(request, {
  42. 'message': message,
  43. 'form': FormLayout(form),
  44. 'tab': 'credentials',
  45. }));
  46. @block_guest
  47. def activate(request, token):
  48. new_credentials = request.session.get('new_credentials')
  49. if not new_credentials or new_credentials['token'] != token:
  50. return error404(request)
  51. if new_credentials['new_email']:
  52. request.user.set_email(new_credentials['new_email'])
  53. if new_credentials['new_password']:
  54. request.user.set_password(new_credentials['new_password'])
  55. try:
  56. request.user.full_clean()
  57. request.user.save(force_update=True)
  58. request.user.sessions.exclude(id=request.session.id).delete()
  59. request.user.signin_tokens.all().delete()
  60. request.messages.set_flash(Message(_("%(username)s, your Sign-In credentials have been changed.") % {'username': request.user.username}), 'success', 'security')
  61. request.session.sign_out(request)
  62. del request.session['new_credentials']
  63. return redirect(reverse('sign_in'))
  64. except ValidationError:
  65. request.messages.set_flash(Message(_("Your new credentials have been invalidated. Please try again.")), 'error', 'usercp_credentials')
  66. return redirect(reverse('usercp_credentials'))