options.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django.contrib.auth import update_session_auth_hash
  2. from django.core.exceptions import PermissionDenied
  3. from django.db import IntegrityError
  4. from django.shortcuts import render
  5. from django.utils.translation import gettext as _
  6. from ..credentialchange import read_new_credential
  7. from ..decorators import deny_guests
  8. from ..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. {
  15. "name": str(section["name"]),
  16. "icon": section["icon"],
  17. "component": section["component"],
  18. }
  19. )
  20. request.frontend_context.update({"USER_OPTIONS": user_options})
  21. return render(request, "misago/options/noscript.html")
  22. class ChangeError(Exception):
  23. pass
  24. def confirm_change_view(f):
  25. @deny_guests
  26. def decorator(request, token):
  27. try:
  28. return f(request, token)
  29. except ChangeError:
  30. return render(request, "misago/options/credentials_error.html", status=400)
  31. return decorator
  32. @confirm_change_view
  33. def confirm_email_change(request, token):
  34. if request.settings.enable_oauth2_client:
  35. raise PermissionDenied(
  36. _("Please use %(provider)s to change your e-mail.")
  37. % {"provider": request.settings.oauth2_provider}
  38. )
  39. new_credential = read_new_credential(request, "email", token)
  40. if not new_credential:
  41. raise ChangeError()
  42. try:
  43. request.user.set_email(new_credential)
  44. request.user.save(update_fields=["email", "email_hash"])
  45. except IntegrityError:
  46. raise ChangeError()
  47. message = _("%(user)s, your e-mail has been changed.")
  48. return render(
  49. request,
  50. "misago/options/credentials_changed.html",
  51. {"message": message % {"user": request.user.username}},
  52. )
  53. @confirm_change_view
  54. def confirm_password_change(request, token):
  55. if request.settings.enable_oauth2_client:
  56. raise PermissionDenied(
  57. _("Please use %(provider)s to change your password.")
  58. % {"provider": request.settings.oauth2_provider}
  59. )
  60. new_credential = read_new_credential(request, "password", token)
  61. if not new_credential:
  62. raise ChangeError()
  63. request.user.set_password(new_credential)
  64. update_session_auth_hash(request, request.user)
  65. request.user.save(update_fields=["password"])
  66. message = _("%(user)s, your password has been changed.")
  67. return render(
  68. request,
  69. "misago/options/credentials_changed.html",
  70. {"message": message % {"user": request.user.username}},
  71. )