options.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.contrib.auth import update_session_auth_hash
  2. from django.core.urlresolvers import reverse
  3. from django.db import IntegrityError
  4. from django.shortcuts import render
  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. @deny_guests
  9. def index(request, *args, **kwargs):
  10. request.frontend_context.update({
  11. 'USERNAME_CHANGES_API': reverse('misago:api:usernamechange-list'),
  12. 'USER_OPTIONS': [
  13. {
  14. 'name': _("Forum options"),
  15. 'icon': 'settings',
  16. 'component': 'forum-options',
  17. },
  18. {
  19. 'name': _("Change username"),
  20. 'icon': 'card_membership',
  21. 'component': 'change-username',
  22. },
  23. {
  24. 'name': _("Change sign-in credentials"),
  25. 'icon': 'vpn_key',
  26. 'component': 'sign-in-credentials',
  27. },
  28. ]
  29. });
  30. return render(request, 'misago/options/noscript.html')
  31. class ChangeError(Exception):
  32. pass
  33. def confirm_change_view(f):
  34. @deny_guests
  35. def decorator(request, token):
  36. try:
  37. return f(request, token)
  38. except ChangeError as e:
  39. return render(request, 'misago/options/credentials_error.html',
  40. status=400)
  41. return decorator
  42. @confirm_change_view
  43. def confirm_email_change(request, token):
  44. new_credential = read_new_credential(request, 'email', token)
  45. if not new_credential:
  46. raise ChangeError()
  47. try:
  48. request.user.set_email(new_credential)
  49. request.user.save(update_fields=['email', 'email_hash'])
  50. except IntegrityError:
  51. raise ChangeError()
  52. message = _("%(user)s, your e-mail has been changed.")
  53. return render(request, 'misago/options/credentials_changed.html', {
  54. 'message': message % {'user': request.user.username},
  55. })
  56. @confirm_change_view
  57. def confirm_password_change(request, token):
  58. new_credential = read_new_credential(request, 'password', token)
  59. if not new_credential:
  60. raise ChangeError()
  61. request.user.set_password(new_credential)
  62. update_session_auth_hash(request, request.user)
  63. request.user.save(update_fields=['password'])
  64. message = _("%(user)s, your password has been changed.")
  65. return render(request, 'misago/options/credentials_changed.html', {
  66. 'message': message % {'user': request.user.username},
  67. })