usercp.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from django.contrib import messages
  2. from django.contrib.auth import update_session_auth_hash
  3. from django.db import IntegrityError, transaction
  4. from django.shortcuts import redirect, render as django_render
  5. from django.utils.translation import ugettext as _
  6. from django.views.decorators.debug import sensitive_post_parameters
  7. from misago.conf import settings
  8. from misago.core.mail import mail_user
  9. from misago.users.decorators import deny_guests
  10. from misago.users.forms.usercp import (ChangeForumOptionsForm,
  11. ChangeUsernameForm,
  12. ChangeEmailPasswordForm)
  13. from misago.users.sites import usercp
  14. from misago.users.changedcredentials import (cache_new_credentials,
  15. get_new_credentials)
  16. from misago.users.namechanges import UsernameChanges
  17. def render(request, template, context=None):
  18. context = context or {}
  19. context['pages'] = usercp.get_pages(request)
  20. for page in context['pages']:
  21. if page['is_active']:
  22. context['active_page'] = page
  23. break
  24. return django_render(request, template, context)
  25. @deny_guests
  26. def change_forum_options(request):
  27. form = ChangeForumOptionsForm(instance=request.user)
  28. if request.method == 'POST':
  29. form = ChangeForumOptionsForm(request.POST, instance=request.user)
  30. if form.is_valid():
  31. form.save()
  32. message = _("Your forum options have been changed.")
  33. messages.success(request, message)
  34. return redirect('misago:usercp_change_forum_options')
  35. return render(request, 'misago/usercp/change_forum_options.html',
  36. {'form': form})
  37. @deny_guests
  38. @transaction.atomic()
  39. def change_username(request):
  40. namechanges = UsernameChanges(request.user)
  41. form = ChangeUsernameForm()
  42. if request.method == 'POST' and namechanges.left:
  43. form = ChangeUsernameForm(request.POST, user=request.user)
  44. if form.is_valid():
  45. request.user.set_username(form.cleaned_data['new_username'])
  46. request.user.save(update_fields=['username', 'username_slug'])
  47. message = _("Your username has been changed.")
  48. messages.success(request, message)
  49. return redirect('misago:usercp_change_username')
  50. return render(request, 'misago/usercp/change_username.html', {
  51. 'form': form,
  52. 'changes_left': namechanges.left,
  53. 'next_change_on': namechanges.next_on
  54. })
  55. @sensitive_post_parameters()
  56. @deny_guests
  57. def change_email_password(request):
  58. form = ChangeEmailPasswordForm()
  59. if request.method == 'POST':
  60. form = ChangeEmailPasswordForm(request.POST, user=request.user)
  61. if form.is_valid():
  62. new_email = ''
  63. new_password = ''
  64. # Store original data
  65. old_email = request.user.email
  66. old_password = request.user.password
  67. # Assign new creds to user temporarily
  68. if form.cleaned_data['new_email']:
  69. request.user.set_email(form.cleaned_data['new_email'])
  70. new_email = request.user.email
  71. if form.cleaned_data['new_password']:
  72. request.user.set_password(form.cleaned_data['new_password'])
  73. new_password = request.user.password
  74. request.user.email = old_email
  75. request.user.password = old_password
  76. credentials_token = cache_new_credentials(
  77. request.user, new_email, new_password)
  78. mail_subject = _("Confirm changes to %(username)s account "
  79. "on %(forum_title)s forums")
  80. subject_formats = {'username': request.user.username,
  81. 'forum_title': settings.forum_name}
  82. mail_subject = mail_subject % subject_formats
  83. if new_email:
  84. # finally override email before sending message
  85. request.user.email = new_email
  86. mail_user(request, request.user, mail_subject,
  87. 'misago/emails/change_email_password',
  88. {'credentials_token': credentials_token})
  89. message = _("E-mail was sent to %(email)s with a link that "
  90. "you have to click to confirm changes.")
  91. messages.info(request, message % {'email': request.user.email})
  92. return redirect('misago:usercp_change_email_password')
  93. return render(request, 'misago/usercp/change_email_password.html',
  94. {'form': form})
  95. @deny_guests
  96. def confirm_email_password_change(request, token):
  97. new_credentials = get_new_credentials(request.user, token)
  98. if not new_credentials:
  99. messages.error(request, _("Confirmation link is invalid."))
  100. else:
  101. changes_made = []
  102. if new_credentials['email']:
  103. request.user.set_email(new_credentials['email'])
  104. changes_made.extend(['email', 'email_hash'])
  105. if new_credentials['password']:
  106. request.user.password = new_credentials['password']
  107. update_session_auth_hash(request, request.user)
  108. changes_made.append('password')
  109. try:
  110. request.user.save(update_fields=changes_made)
  111. message = _("Changes in e-mail and password have been saved.")
  112. messages.success(request, message)
  113. except IntegrityError:
  114. messages.error(request, _("Confirmation link is invalid."))
  115. return redirect('misago:usercp_change_email_password')