mirror of
https://github.com/Tivix/django-rest-auth.git
synced 2025-02-06 21:20:32 +03:00
email work
This commit is contained in:
parent
0677109c1b
commit
1a08fd90dc
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
39
demo/templates/email_change.html
Normal file
39
demo/templates/email_change.html
Normal 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 %}
|
26
demo/templates/fragments/email_change_form.html
Normal file
26
demo/templates/fragments/email_change_form.html
Normal 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>
|
||||||
|
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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)
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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."})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user