options.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. new_credential = read_new_credential(request, "email", token)
  35. if not new_credential:
  36. raise ChangeError()
  37. try:
  38. request.user.set_email(new_credential)
  39. request.user.save(update_fields=["email", "email_hash"])
  40. except IntegrityError:
  41. raise ChangeError()
  42. message = _("%(user)s, your e-mail has been changed.")
  43. return render(
  44. request,
  45. "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(
  58. request,
  59. "misago/options/credentials_changed.html",
  60. {"message": message % {"user": request.user.username}},
  61. )