options.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from django.contrib.auth import update_session_auth_hash
  2. from django.db import IntegrityError
  3. from django.shortcuts import render
  4. from django.urls import reverse
  5. from django.utils import six
  6. from django.utils.translation import ugettext as _
  7. from misago.users.credentialchange import read_new_credential
  8. from misago.users.decorators import deny_guests
  9. from misago.users.pages import usercp
  10. @deny_guests
  11. def index(request, *args, **kwargs):
  12. user_options = []
  13. for section in usercp.get_sections(request):
  14. user_options.append({
  15. 'name': six.text_type(section['name']),
  16. 'icon': section['icon'],
  17. 'component': section['component'],
  18. })
  19. request.frontend_context.update({
  20. 'USER_OPTIONS': user_options
  21. })
  22. return render(request, 'misago/options/noscript.html')
  23. class ChangeError(Exception):
  24. pass
  25. def confirm_change_view(f):
  26. @deny_guests
  27. def decorator(request, token):
  28. try:
  29. return f(request, token)
  30. except ChangeError as e:
  31. return render(request, 'misago/options/credentials_error.html',
  32. status=400)
  33. return decorator
  34. @confirm_change_view
  35. def confirm_email_change(request, token):
  36. new_credential = read_new_credential(request, 'email', token)
  37. if not new_credential:
  38. raise ChangeError()
  39. try:
  40. request.user.set_email(new_credential)
  41. request.user.save(update_fields=['email', 'email_hash'])
  42. except IntegrityError:
  43. raise ChangeError()
  44. message = _("%(user)s, your e-mail has been changed.")
  45. return render(request, 'misago/options/credentials_changed.html', {
  46. 'message': message % {'user': request.user.username},
  47. })
  48. @confirm_change_view
  49. def confirm_password_change(request, token):
  50. new_credential = read_new_credential(request, 'password', token)
  51. if not new_credential:
  52. raise ChangeError()
  53. request.user.set_password(new_credential)
  54. update_session_auth_hash(request, request.user)
  55. request.user.save(update_fields=['password'])
  56. message = _("%(user)s, your password has been changed.")
  57. return render(request, 'misago/options/credentials_changed.html', {
  58. 'message': message % {'user': request.user.username},
  59. })