options.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 gettext as _
  5. from ..credentialchange import read_new_credential
  6. from ..decorators import deny_guests
  7. from ..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. {
  14. "name": str(section["name"]),
  15. "icon": section["icon"],
  16. "component": section["component"],
  17. }
  18. )
  19. request.frontend_context.update({"USER_OPTIONS": user_options})
  20. return render(request, "misago/options/noscript.html")
  21. class ChangeError(Exception):
  22. pass
  23. def confirm_change_view(f):
  24. @deny_guests
  25. def decorator(request, token):
  26. try:
  27. return f(request, token)
  28. except ChangeError:
  29. return render(request, "misago/options/credentials_error.html", status=400)
  30. return decorator
  31. @confirm_change_view
  32. def confirm_email_change(request, token):
  33. new_credential = read_new_credential(request, "email", token)
  34. if not new_credential:
  35. raise ChangeError()
  36. try:
  37. request.user.set_email(new_credential)
  38. request.user.save(update_fields=["email", "email_hash"])
  39. except IntegrityError:
  40. raise ChangeError()
  41. message = _("%(user)s, your e-mail has been changed.")
  42. return render(
  43. request,
  44. "misago/options/credentials_changed.html",
  45. {"message": message % {"user": request.user.username}},
  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,
  58. "misago/options/credentials_changed.html",
  59. {"message": message % {"user": request.user.username}},
  60. )