mirror of
https://github.com/Tivix/django-rest-auth.git
synced 2025-04-19 16:22:12 +03:00
Merge ea1150b421
into cdd04aa9be
This commit is contained in:
commit
b958883c02
|
@ -215,3 +215,7 @@ class RegisterSerializer(serializers.Serializer):
|
|||
|
||||
class VerifyEmailSerializer(serializers.Serializer):
|
||||
key = serializers.CharField()
|
||||
|
||||
|
||||
class ResendVerificationEmailSerializer(serializers.Serializer):
|
||||
email = serializers.EmailField()
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
from django.views.generic import TemplateView
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import RegisterView, VerifyEmailView
|
||||
from .views import (
|
||||
RegisterView,
|
||||
VerifyEmailView,
|
||||
ResendVerificationEmailView
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', RegisterView.as_view(), name='rest_register'),
|
||||
url(r'^resend-verification-email/$', ResendVerificationEmailView.as_view(), name='rest_resend_verification_email'),
|
||||
url(r'^verify-email/$', VerifyEmailView.as_view(), name='rest_verify_email'),
|
||||
|
||||
# This url is used by django-allauth and empty TemplateView is
|
||||
# defined just to allow reverse() call inside app, for example when email
|
||||
# with verification link is being sent, then it's required to render email
|
||||
|
|
|
@ -14,6 +14,7 @@ from rest_framework import status
|
|||
from allauth.account.adapter import get_adapter
|
||||
from allauth.account.views import ConfirmEmailView
|
||||
from allauth.account.utils import complete_signup
|
||||
from allauth.account.models import EmailAddress
|
||||
from allauth.account import app_settings as allauth_settings
|
||||
from allauth.socialaccount import signals
|
||||
from allauth.socialaccount.adapter import get_adapter as get_social_adapter
|
||||
|
@ -24,6 +25,7 @@ from rest_auth.app_settings import (TokenSerializer,
|
|||
create_token)
|
||||
from rest_auth.models import TokenModel
|
||||
from rest_auth.registration.serializers import (VerifyEmailSerializer,
|
||||
ResendVerificationEmailSerializer,
|
||||
SocialLoginSerializer,
|
||||
SocialAccountSerializer,
|
||||
SocialConnectSerializer)
|
||||
|
@ -98,6 +100,25 @@ class VerifyEmailView(APIView, ConfirmEmailView):
|
|||
return Response({'detail': _('ok')}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class ResendVerificationEmailView(GenericAPIView):
|
||||
serializer_class = ResendVerificationEmailSerializer
|
||||
permission_classes = (AllowAny,)
|
||||
allowed_methods = ('POST', 'OPTIONS', 'HEAD')
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
email = serializer.data['email']
|
||||
|
||||
try:
|
||||
email_address = EmailAddress.objects.get(email__exact=email, verified=False)
|
||||
email_address.send_confirmation(self.request, True)
|
||||
except EmailAddress.DoesNotExist:
|
||||
pass
|
||||
|
||||
return Response({'detail': _('Verification e-mail sent.')})
|
||||
|
||||
|
||||
class SocialLoginView(LoginView):
|
||||
"""
|
||||
class used for social authentications
|
||||
|
|
|
@ -11,6 +11,8 @@ from rest_framework.test import APIRequestFactory
|
|||
from rest_auth.registration.views import RegisterView
|
||||
from rest_auth.registration.app_settings import register_permission_classes
|
||||
|
||||
from allauth.account.models import EmailAddress
|
||||
|
||||
from .mixins import TestsMixin, CustomPermissionClass
|
||||
|
||||
try:
|
||||
|
@ -516,3 +518,66 @@ class APIBasicTests(TestsMixin, TestCase):
|
|||
|
||||
self.post(self.login_url, data=payload, status_code=status.HTTP_200_OK)
|
||||
self.get(self.logout_url, status_code=status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||
|
||||
@override_settings(ACCOUNT_EMAIL_VERIFICATION='mandatory')
|
||||
def test_resend_account_verification_email(self):
|
||||
self.post(
|
||||
self.register_url,
|
||||
data=self.REGISTRATION_DATA_WITH_EMAIL,
|
||||
status_code=status.HTTP_201_CREATED
|
||||
)
|
||||
|
||||
self.assertEqual(EmailAddress.objects.count(), 1)
|
||||
self.assertEqual(EmailAddress.objects.first().email, self.EMAIL)
|
||||
self.assertEqual(EmailAddress.objects.first().verified, False)
|
||||
|
||||
self.post(
|
||||
reverse('rest_resend_verification_email'),
|
||||
data={
|
||||
'email': self.EMAIL
|
||||
},
|
||||
status_code=status.HTTP_200_OK
|
||||
)
|
||||
|
||||
self.assertEqual(len(mail.outbox), 2)
|
||||
|
||||
@override_settings(ACCOUNT_EMAIL_VERIFICATION='mandatory')
|
||||
def test_resend_not_registered_account_verification_email(self):
|
||||
self.assertEqual(EmailAddress.objects.count(), 0)
|
||||
|
||||
self.post(
|
||||
reverse('rest_resend_verification_email'),
|
||||
data={
|
||||
'email': self.EMAIL
|
||||
},
|
||||
status_code=status.HTTP_200_OK
|
||||
)
|
||||
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
@override_settings(ACCOUNT_EMAIL_VERIFICATION='mandatory')
|
||||
def test_resend_already_verified_account_verification_email(self):
|
||||
self.post(
|
||||
self.register_url,
|
||||
data=self.REGISTRATION_DATA_WITH_EMAIL,
|
||||
status_code=status.HTTP_201_CREATED
|
||||
)
|
||||
|
||||
self.assertEqual(EmailAddress.objects.count(), 1)
|
||||
self.assertEqual(EmailAddress.objects.first().email, self.EMAIL)
|
||||
self.assertEqual(EmailAddress.objects.first().verified, False)
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
email_address = EmailAddress.objects.first()
|
||||
email_address.verified = True
|
||||
email_address.save()
|
||||
|
||||
self.post(
|
||||
reverse('rest_resend_verification_email'),
|
||||
data={
|
||||
'email': self.EMAIL
|
||||
},
|
||||
status_code=status.HTTP_200_OK
|
||||
)
|
||||
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
|
Loading…
Reference in New Issue
Block a user