changeemail.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from django.core.exceptions import ValidationError
  2. from django.db import IntegrityError
  3. from django.utils.translation import ugettext as _
  4. from rest_framework import status
  5. from rest_framework.response import Response
  6. from misago.conf import settings
  7. from misago.core.mail import mail_user
  8. from misago.users.forms.options import ChangeEmailForm
  9. from misago.users.credentialchange import (store_new_credential,
  10. read_new_credential)
  11. def change_email_endpoint(request, pk=None):
  12. if 'token' in request.data:
  13. return use_token(request, request.data['token'])
  14. else:
  15. return handle_form_submission(request)
  16. def handle_form_submission(request):
  17. form = ChangeEmailForm(request.data, user=request.user)
  18. if form.is_valid():
  19. token = store_new_credential(
  20. request, 'email', form.cleaned_data['new_email'])
  21. mail_subject = _("Confirm e-mail change on %(forum_title)s forums")
  22. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  23. # swap address with new one so email is sent to new address
  24. request.user.email = form.cleaned_data['new_email']
  25. mail_user(request, request.user, mail_subject,
  26. 'misago/emails/change_email',
  27. {'token': token})
  28. message = _("E-mail change confirmation link was sent to new address.")
  29. return Response({'detail': message})
  30. else:
  31. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  32. def token_error_handler(f):
  33. def decorator(request, token):
  34. try:
  35. return f(request, token)
  36. except (ValueError, IntegrityError):
  37. message = _("E-mail change link has expired. Please try again.")
  38. return Response({'detail': message},
  39. status=status.HTTP_400_BAD_REQUEST)
  40. return decorator
  41. @token_error_handler
  42. def use_token(request, token):
  43. new_email = read_new_credential(request, 'email', token)
  44. if new_email:
  45. request.user.set_email(new_email)
  46. request.user.save()
  47. return Response({'detail': _("Your e-mail has been changed.")})
  48. else:
  49. raise ValueError()