options.py 2.2 KB

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