options.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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.utils import six
  5. from django.utils.translation import ugettext as _
  6. from misago.users.credentialchange import read_new_credential
  7. from misago.users.decorators import deny_guests
  8. from misago.users.pages import usercp
  9. @deny_guests
  10. def index(request, *args, **kwargs):
  11. user_options = []
  12. for section in usercp.get_sections(request):
  13. user_options.append({
  14. 'name': six.text_type(section['name']),
  15. 'icon': section['icon'],
  16. 'component': section['component'],
  17. })
  18. request.frontend_context.update({'USER_OPTIONS': user_options})
  19. return render(request, 'misago/options/noscript.html')
  20. class ChangeError(Exception):
  21. pass
  22. def confirm_change_view(f):
  23. @deny_guests
  24. def decorator(request, token):
  25. try:
  26. return f(request, token)
  27. except ChangeError:
  28. return render(request, 'misago/options/credentials_error.html', status=400)
  29. return decorator
  30. @confirm_change_view
  31. def confirm_email_change(request, token):
  32. new_credential = read_new_credential(request, 'email', token)
  33. if not new_credential:
  34. raise ChangeError()
  35. try:
  36. request.user.set_email(new_credential)
  37. request.user.save(update_fields=['email', 'email_hash'])
  38. except IntegrityError:
  39. raise ChangeError()
  40. message = _("%(user)s, your e-mail has been changed.")
  41. return render(
  42. request, 'misago/options/credentials_changed.html', {
  43. 'message': message % {
  44. 'user': request.user.username,
  45. },
  46. }
  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(
  58. request, 'misago/options/credentials_changed.html', {
  59. 'message': message % {
  60. 'user': request.user.username,
  61. },
  62. }
  63. )