email work

This commit is contained in:
Tabatha Memmott 2016-01-07 13:39:16 -08:00
parent 0677109c1b
commit 1a08fd90dc
10 changed files with 132 additions and 5 deletions

View File

@ -24,6 +24,9 @@ urlpatterns = [
url(r'^password-change/$', url(r'^password-change/$',
TemplateView.as_view(template_name="password_change.html"), TemplateView.as_view(template_name="password_change.html"),
name='password-change'), name='password-change'),
url(r'^email-change/$',
TemplateView.as_view(template_name="email_change.html"),
name='email-change'),
# this url is used to generate email content # this url is used to generate email content

View File

@ -37,6 +37,7 @@
<li><a href="{% url 'login' %}">Login</a></li> <li><a href="{% url 'login' %}">Login</a></li>
<li><a href="{% url 'password-reset' %}">Password Reset</a></li> <li><a href="{% url 'password-reset' %}">Password Reset</a></li>
<li><a href="{% url 'password-reset-confirm' %}">Password Reset Confirm</a></li> <li><a href="{% url 'password-reset-confirm' %}">Password Reset Confirm</a></li>
<li><a href="{% url 'email-change' %}">Update Primary Email</a></li>
<li class="divider"></li> <li class="divider"></li>
<!-- these pages require user token --> <!-- these pages require user token -->
<li><a href="{% url 'user-details' %}">User details</a></li> <li><a href="{% url 'user-details' %}">User details</a></li>

View File

@ -0,0 +1,39 @@
{% extends "base.html" %}
{% block content %}
<div class="row">
<div class="form-group">
<label for="token" class="col-sm-2 control-label">User Token</label>
<div class="col-sm-4">
<input name="token" type="text" class="form-control" id="token" placeholder="Token">
<p class="help-block">Token received after login</p>
</div>
</div>
</div>
<div class="row">
<h3>Update User Details</h3><hr/>
{% include "fragments/email_change_form.html" %}
</div>
{% endblock %}
{% block script %}
<script type="text/javascript">
$().ready(function(){
$('form button[type=submit]').click(function(){
var token = $('input[name=token]').val();
var form = $('form');
$.ajax({
url: form.attr('action'),
data: $('form').serialize(),
type: "POST",
beforeSend: function(xhr){xhr.setRequestHeader('Authorization', 'Token '+token);}
}).fail(function(data){error_response(data);})
.done(function(data){susccess_response(data);});
return false;
});
});
</script>
{% endblock %}

View File

@ -0,0 +1,26 @@
<!-- Signup form -->
<form class="form-horizontal ajax-post" role="form" action="{% url 'rest_email_change' %}">{% csrf_token %}
<div class="form-group">
<label for="email" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input name="email" type="text" class="form-control" id="email" placeholder="Email">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<input name="password" type="password" class="form-control" id="password" placeholder="Password">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Change Email</button>
</div>
</div>
<div class="form-group api-response"></div>
</form>

View File

@ -1,5 +1,5 @@
<!-- Signup form --> <!-- Signup form -->
<form class="form-horizontal ajax-post" role="form" action="{% url 'rest_verify_email' %}">{% csrf_token %} <form class="form-horizontal ajax-post" role="form" action="{% url 'rest_email_change' %}">{% csrf_token %}
<div class="form-group"> <div class="form-group">
<label for="key" class="col-sm-2 control-label">Key</label> <label for="key" class="col-sm-2 control-label">Key</label>
<div class="col-sm-10"> <div class="col-sm-10">

View File

@ -6,7 +6,8 @@ from rest_auth.serializers import (
LoginSerializer as DefaultLoginSerializer, LoginSerializer as DefaultLoginSerializer,
PasswordResetSerializer as DefaultPasswordResetSerializer, PasswordResetSerializer as DefaultPasswordResetSerializer,
PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer, PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer,
PasswordChangeSerializer as DefaultPasswordChangeSerializer) PasswordChangeSerializer as DefaultPasswordChangeSerializer
EmailChangeSerializer as DefaultEmailChangeSerializer)
from .utils import import_callable from .utils import import_callable
@ -42,4 +43,11 @@ PasswordChangeSerializer = import_callable(
'PASSWORD_CHANGE_SERIALIZER', 'PASSWORD_CHANGE_SERIALIZER',
DefaultPasswordChangeSerializer DefaultPasswordChangeSerializer
) )
)
EmailChangeSerializer = import_callable(
serializers.get(
'EMAIL_CHANGE_SERIALIZER',
DefaultEmailChangeSerializer)
)
) )

View File

@ -20,4 +20,5 @@ urlpatterns = [
# djang-allauth https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py#L190 # djang-allauth https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py#L190
url(r'^account-confirm-email/(?P<key>\w+)/$', TemplateView.as_view(), url(r'^account-confirm-email/(?P<key>\w+)/$', TemplateView.as_view(),
name='account_confirm_email'), name='account_confirm_email'),
url(r'^change-email/$', VerifyEmailView.as_view(), name='rest_email_change'),
] ]

View File

@ -85,7 +85,7 @@ class TokenSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Token model = Token
fields = ('key',) fields = ('key')
class UserDetailsSerializer(serializers.ModelSerializer): class UserDetailsSerializer(serializers.ModelSerializer):
@ -96,7 +96,6 @@ class UserDetailsSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = UserModel model = UserModel
fields = ('username', 'email', 'first_name', 'last_name') fields = ('username', 'email', 'first_name', 'last_name')
read_only_fields = ('email', )
class PasswordResetSerializer(serializers.Serializer): class PasswordResetSerializer(serializers.Serializer):
@ -221,3 +220,33 @@ class PasswordChangeSerializer(serializers.Serializer):
if not self.logout_on_password_change: if not self.logout_on_password_change:
from django.contrib.auth import update_session_auth_hash from django.contrib.auth import update_session_auth_hash
update_session_auth_hash(self.request, self.user) update_session_auth_hash(self.request, self.user)
class EmailChangeSerializer(serializers.Serializer):
email_address = serializers.CharField(max_length=128)
set_email_form_class = SetEmailForm
def __init__(self, *args, **kwargs):
self.old_email_field_enabled = getattr(
settings, 'OLD_EMAIL_FIELD_ENABLED', False
)
self.logout_on_email_change = getattr(
settings, 'LOGOUT_ON_EMAIL_CHANGE', False
)
super(EmailChangeSerializer, self).__init__(*args, **kwargs)
if not self.old_email_field_enabled:
self.fields.pop('old_email')
self.request = self.context.get('request')
self.user = getattr(self.request, 'user', None)
def save(self):
self.set_email_form.save()
if not self.logout_on_email_change:
from django.contrib.auth import update_session_auth_hash
update_session_auth_hash(self.request, self.user)

View File

@ -2,7 +2,7 @@ from django.conf.urls import url
from rest_auth.views import ( from rest_auth.views import (
LoginView, LogoutView, UserDetailsView, PasswordChangeView, LoginView, LogoutView, UserDetailsView, PasswordChangeView,
PasswordResetView, PasswordResetConfirmView PasswordResetView, PasswordResetConfirmView, EmailChangeView,
) )
urlpatterns = [ urlpatterns = [
@ -17,4 +17,6 @@ urlpatterns = [
url(r'^user/$', UserDetailsView.as_view(), name='rest_user_details'), url(r'^user/$', UserDetailsView.as_view(), name='rest_user_details'),
url(r'^password/change/$', PasswordChangeView.as_view(), url(r'^password/change/$', PasswordChangeView.as_view(),
name='rest_password_change'), name='rest_password_change'),
url(r'^email/change/$', EmailChangeView.as_view(),
name='rest_email_change'),
] ]

View File

@ -154,3 +154,21 @@ class PasswordChangeView(GenericAPIView):
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
serializer.save() serializer.save()
return Response({"success": "New password has been saved."}) return Response({"success": "New password has been saved."})
class EmailChangeView(GenericAPIView):
"""
Calls Django Auth SetPasswordForm save method.
Accepts the following POST parameters: new_password1, new_password2
Returns the success/fail message.
"""
serializer_class = EmailChangeSerializer
permission_classes = (IsAuthenticated,)
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({"success": "New Email has been saved."})