options.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from django.shortcuts import redirect, render
  2. from django.utils.translation import ugettext as _
  3. from misago.core.views import noscript
  4. from misago.users.decorators import deflect_guests
  5. @deflect_guests
  6. def index(request):
  7. return redirect('misago:options_form', form_name='forum-options')
  8. @deflect_guests
  9. def form(request, form_name):
  10. return noscript(request, **{
  11. 'title': _("Options"),
  12. 'message': _("To change options enable JS."),
  13. })
  14. # DEPRECATED VIEWS - DELETE AFTER USER CP IS DONE
  15. def change_username(request):
  16. namechanges = UsernameChanges(request.user)
  17. form = ChangeUsernameForm()
  18. if request.method == 'POST' and namechanges.left:
  19. form = ChangeUsernameForm(request.POST, user=request.user)
  20. if form.is_valid():
  21. try:
  22. form.change_username(changed_by=request.user)
  23. message = _("Your username has been changed.")
  24. messages.success(request, message)
  25. return redirect('misago:usercp_change_username')
  26. except IntegrityError:
  27. message = _("Error changing username. Please try again.")
  28. messages.error(request, message)
  29. return render(request, 'misago/usercp/change_username.html', {
  30. 'form': form,
  31. 'changes_left': namechanges.left,
  32. 'next_change_on': namechanges.next_on
  33. })
  34. def change_email_password(request):
  35. form = ChangeEmailPasswordForm()
  36. if request.method == 'POST':
  37. form = ChangeEmailPasswordForm(request.POST, user=request.user)
  38. if form.is_valid():
  39. new_email = ''
  40. new_password = ''
  41. # Store original data
  42. old_email = request.user.email
  43. old_password = request.user.password
  44. # Assign new creds to user temporarily
  45. if form.cleaned_data['new_email']:
  46. request.user.set_email(form.cleaned_data['new_email'])
  47. new_email = request.user.email
  48. if form.cleaned_data['new_password']:
  49. request.user.set_password(form.cleaned_data['new_password'])
  50. new_password = request.user.password
  51. request.user.email = old_email
  52. request.user.password = old_password
  53. credentials_token = cache_new_credentials(
  54. request.user, new_email, new_password)
  55. mail_subject = _("Confirm changes to %(user)s account "
  56. "on %(forum_title)s forums")
  57. subject_formats = {'user': request.user.username,
  58. 'forum_title': settings.forum_name}
  59. mail_subject = mail_subject % subject_formats
  60. if new_email:
  61. # finally override email before sending message
  62. request.user.email = new_email
  63. mail_user(request, request.user, mail_subject,
  64. 'misago/emails/change_email_password',
  65. {'credentials_token': credentials_token})
  66. message = _("E-mail was sent to %(email)s with a link that "
  67. "you have to click to confirm changes.")
  68. messages.info(request, message % {'email': request.user.email})
  69. return redirect('misago:usercp_change_email_password')
  70. return render(request, 'misago/usercp/change_email_password.html',
  71. {'form': form})
  72. def confirm_email_password_change(request, token):
  73. new_credentials = get_new_credentials(request.user, token)
  74. if not new_credentials:
  75. messages.error(request, _("Confirmation link is invalid."))
  76. else:
  77. changes_made = []
  78. if new_credentials['email']:
  79. request.user.set_email(new_credentials['email'])
  80. changes_made.extend(['email', 'email_hash'])
  81. if new_credentials['password']:
  82. request.user.password = new_credentials['password']
  83. update_session_auth_hash(request, request.user)
  84. changes_made.append('password')
  85. try:
  86. request.user.save(update_fields=changes_made)
  87. message = _("Changes in e-mail and password have been saved.")
  88. messages.success(request, message)
  89. except IntegrityError:
  90. messages.error(request, _("Confirmation link is invalid."))
  91. return redirect('misago:usercp_change_email_password')