views.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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.apps.errors import error404
  6. from misago.decorators import block_guest
  7. from misago.forms import FormLayout
  8. from misago.messages import Message
  9. from misago.utils.strings import random_string
  10. from misago.apps.usercp.template import RequestContext
  11. from misago.apps.usercp.credentials.forms import CredentialsChangeForm
  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 = 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'))