u
This commit is contained in:
parent
fdc9bb8f23
commit
300a1efc4e
5 changed files with 48 additions and 6 deletions
|
|
@ -324,6 +324,7 @@ LOGOUT_ON_PASSWORD_CHANGE = False
|
||||||
ACCOUNT_CHANGE_EMAIL = True
|
ACCOUNT_CHANGE_EMAIL = True
|
||||||
ACCOUNT_EMAIL_CONFIRMATION_HMAC = True
|
ACCOUNT_EMAIL_CONFIRMATION_HMAC = True
|
||||||
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
|
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
|
||||||
|
ACCOUNT_MAX_EMAIL_ADDRESSES = 2
|
||||||
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = None
|
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = None
|
||||||
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None
|
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None
|
||||||
# ACCOUNT_RATE_LIMITS = {
|
# ACCOUNT_RATE_LIMITS = {
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,25 @@ class CustomRegisterSerializer(RegisterSerializer):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ChangeEmailSerializer(serializers.Serializer):
|
class ChangeEmailSerializer(serializers.Serializer):
|
||||||
email = serializers.EmailField()
|
email = serializers.EmailField()
|
||||||
|
|
||||||
|
def validate_email(self, value):
|
||||||
|
if EmailAddress.objects.filter(email=value).exists() or User.objects.filter(email=value).exists():
|
||||||
|
raise serializers.ValidationError("This email is already in use.")
|
||||||
|
return value
|
||||||
|
|
||||||
|
def save(self, user):
|
||||||
|
email = self.validated_data["email"]
|
||||||
|
EmailAddress.objects.filter(user=user, verified=False).delete() # حذف الايميلات السابقة
|
||||||
|
|
||||||
|
email_address, created = EmailAddress.objects.get_or_create(
|
||||||
|
user=user,
|
||||||
|
email=email,
|
||||||
|
defaults={"primary": False, "verified": False}
|
||||||
|
)
|
||||||
|
|
||||||
|
if created:
|
||||||
|
send_email_confirmation(self.context["request"], user, email=email)
|
||||||
|
|
||||||
|
return email
|
||||||
10
lms/accounts/signals.py
Normal file
10
lms/accounts/signals.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
from allauth.account.signals import email_confirmed
|
||||||
|
from django.dispatch import receiver
|
||||||
|
from allauth.account.models import EmailAddress
|
||||||
|
|
||||||
|
@receiver(email_confirmed)
|
||||||
|
def set_primary_email(sender, request, email_address, **kwargs):
|
||||||
|
user = email_address.user
|
||||||
|
EmailAddress.objects.filter(user=user).update(primary=False)
|
||||||
|
email_address.primary = True
|
||||||
|
email_address.save()
|
||||||
|
|
@ -12,4 +12,5 @@ urlpatterns = [
|
||||||
PasswordResetConfirmView.as_view(),
|
PasswordResetConfirmView.as_view(),
|
||||||
name='password_reset_confirm',
|
name='password_reset_confirm',
|
||||||
),
|
),
|
||||||
|
path('change-email/', views.ChangeEmailView.as_view(), name='change_email'),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,24 @@ from rest_framework.views import APIView
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from allauth.account.models import EmailConfirmation, EmailConfirmationHMAC
|
from allauth.account.models import EmailConfirmation, EmailConfirmationHMAC, EmailAddress
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||||
from .serializers import ChangeEmailSerializer
|
from .serializers import ChangeEmailSerializer
|
||||||
|
from asgiref.sync import sync_to_async
|
||||||
|
|
||||||
|
class ChangeEmailView(APIView):
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
serializer = ChangeEmailSerializer(data=request.data, context={"request": request})
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save(user=request.user)
|
||||||
|
return Response({
|
||||||
|
"message": "Confirmation email has been sent to the new address.",
|
||||||
|
}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ConfirmEmailAPIView(APIView):
|
class ConfirmEmailAPIView(APIView):
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
|
|
@ -29,5 +43,5 @@ class ConfirmEmailAPIView(APIView):
|
||||||
|
|
||||||
# Verify the email
|
# Verify the email
|
||||||
email_confirmation.confirm(request)
|
email_confirmation.confirm(request)
|
||||||
|
email = email_confirmation.email_address.email
|
||||||
return Response({"detail": _("Email successfully verified.")}, status=status.HTTP_200_OK)
|
return Response({"detail": _("Email successfully verified."), "email": email}, status=status.HTTP_200_OK)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue