options.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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('options_form', form='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 edit_signature(request):
  16. if not request.user.acl['can_have_signature']:
  17. raise Http404()
  18. if request.method == "GET":
  19. read_user_notifications(request.user,
  20. 'usercp_signature_%s' % request.user.pk)
  21. form = EditSignatureForm(instance=request.user)
  22. if not request.user.is_signature_locked and request.method == 'POST':
  23. form = EditSignatureForm(request.POST, instance=request.user)
  24. if form.is_valid():
  25. set_user_signature(
  26. request, request.user, form.cleaned_data['signature'])
  27. request.user.save(update_fields=[
  28. 'signature', 'signature_parsed', 'signature_checksum'
  29. ])
  30. if form.cleaned_data['signature']:
  31. messages.success(request, _("Your signature has been edited."))
  32. else:
  33. message = _("Your signature has been cleared.")
  34. messages.success(request, message)
  35. return redirect('misago:usercp_edit_signature')
  36. acl = request.user.acl
  37. editor = Editor(form['signature'],
  38. allow_blocks=acl['allow_signature_blocks'],
  39. allow_links=acl['allow_signature_links'],
  40. allow_images=acl['allow_signature_images'])
  41. return render(request, 'misago/usercp/edit_signature.html',
  42. {'form': form, 'editor': editor})
  43. def change_username(request):
  44. namechanges = UsernameChanges(request.user)
  45. form = ChangeUsernameForm()
  46. if request.method == 'POST' and namechanges.left:
  47. form = ChangeUsernameForm(request.POST, user=request.user)
  48. if form.is_valid():
  49. try:
  50. form.change_username(changed_by=request.user)
  51. message = _("Your username has been changed.")
  52. messages.success(request, message)
  53. return redirect('misago:usercp_change_username')
  54. except IntegrityError:
  55. message = _("Error changing username. Please try again.")
  56. messages.error(request, message)
  57. return render(request, 'misago/usercp/change_username.html', {
  58. 'form': form,
  59. 'changes_left': namechanges.left,
  60. 'next_change_on': namechanges.next_on
  61. })
  62. def change_email_password(request):
  63. form = ChangeEmailPasswordForm()
  64. if request.method == 'POST':
  65. form = ChangeEmailPasswordForm(request.POST, user=request.user)
  66. if form.is_valid():
  67. new_email = ''
  68. new_password = ''
  69. # Store original data
  70. old_email = request.user.email
  71. old_password = request.user.password
  72. # Assign new creds to user temporarily
  73. if form.cleaned_data['new_email']:
  74. request.user.set_email(form.cleaned_data['new_email'])
  75. new_email = request.user.email
  76. if form.cleaned_data['new_password']:
  77. request.user.set_password(form.cleaned_data['new_password'])
  78. new_password = request.user.password
  79. request.user.email = old_email
  80. request.user.password = old_password
  81. credentials_token = cache_new_credentials(
  82. request.user, new_email, new_password)
  83. mail_subject = _("Confirm changes to %(user)s account "
  84. "on %(forum_title)s forums")
  85. subject_formats = {'user': request.user.username,
  86. 'forum_title': settings.forum_name}
  87. mail_subject = mail_subject % subject_formats
  88. if new_email:
  89. # finally override email before sending message
  90. request.user.email = new_email
  91. mail_user(request, request.user, mail_subject,
  92. 'misago/emails/change_email_password',
  93. {'credentials_token': credentials_token})
  94. message = _("E-mail was sent to %(email)s with a link that "
  95. "you have to click to confirm changes.")
  96. messages.info(request, message % {'email': request.user.email})
  97. return redirect('misago:usercp_change_email_password')
  98. return render(request, 'misago/usercp/change_email_password.html',
  99. {'form': form})
  100. def confirm_email_password_change(request, token):
  101. new_credentials = get_new_credentials(request.user, token)
  102. if not new_credentials:
  103. messages.error(request, _("Confirmation link is invalid."))
  104. else:
  105. changes_made = []
  106. if new_credentials['email']:
  107. request.user.set_email(new_credentials['email'])
  108. changes_made.extend(['email', 'email_hash'])
  109. if new_credentials['password']:
  110. request.user.password = new_credentials['password']
  111. update_session_auth_hash(request, request.user)
  112. changes_made.append('password')
  113. try:
  114. request.user.save(update_fields=changes_made)
  115. message = _("Changes in e-mail and password have been saved.")
  116. messages.success(request, message)
  117. except IntegrityError:
  118. messages.error(request, _("Confirmation link is invalid."))
  119. return redirect('misago:usercp_change_email_password')