From af8a26ce715d364d558c9756efdd3a586218a80b Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 9 Apr 2024 16:09:35 +0200 Subject: [PATCH] Send email to validate accounts --- tournaments/serializers.py | 22 ++++++++++++++++++- .../tournaments/acc_active_email.html | 5 +++++ tournaments/tokens.py | 10 +++++++++ tournaments/urls.py | 1 + tournaments/views.py | 16 ++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tournaments/templates/tournaments/acc_active_email.html create mode 100644 tournaments/tokens.py diff --git a/tournaments/serializers.py b/tournaments/serializers.py index 7321ad0..4ef8a45 100644 --- a/tournaments/serializers.py +++ b/tournaments/serializers.py @@ -2,13 +2,19 @@ from rest_framework import serializers from .models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration from django.contrib.auth import password_validation from django.utils.translation import gettext_lazy as _ +# email +from .tokens import account_activation_token +from django.template.loader import render_to_string +from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode +from django.utils.encoding import force_bytes +from django.core.mail import EmailMessage +from django.contrib.sites.shortcuts import get_current_site class UserSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) def create(self, validated_data): - # Customize user creation logic here print(validated_data) umpire_code = None @@ -37,6 +43,7 @@ class UserSerializer(serializers.ModelSerializer): country=country, ) + self.send_email(self.context['request'], user) # RegistrationProfile.objects.filter(user=user).send_activation_email() return user @@ -48,6 +55,19 @@ class UserSerializer(serializers.ModelSerializer): # ) # return user + def send_email(self, request, user): + + current_site = get_current_site(request) + mail_subject = 'Activation link has been sent to your email id' + message = render_to_string('tournaments/acc_active_email.html', { + 'user': user, + 'domain': current_site.domain, + 'uid':urlsafe_base64_encode(force_bytes(user.pk)), + 'token':account_activation_token.make_token(user), + }) + email = EmailMessage(mail_subject, message, to=[user.email]) + email.send() + class Meta: club_id = serializers.PrimaryKeyRelatedField(queryset=Club.objects.all()) model = CustomUser diff --git a/tournaments/templates/tournaments/acc_active_email.html b/tournaments/templates/tournaments/acc_active_email.html new file mode 100644 index 0000000..743fece --- /dev/null +++ b/tournaments/templates/tournaments/acc_active_email.html @@ -0,0 +1,5 @@ + {% autoescape off %} + Hi {{ user.username }}, + Please click on the link to confirm your registration, + http://{{ domain }}{% url 'activate' uidb64=uid token=token %} + {% endautoescape %} \ No newline at end of file diff --git a/tournaments/tokens.py b/tournaments/tokens.py new file mode 100644 index 0000000..a656484 --- /dev/null +++ b/tournaments/tokens.py @@ -0,0 +1,10 @@ +from django.contrib.auth.tokens import PasswordResetTokenGenerator +# from django.utils import six + +class TokenGenerator(PasswordResetTokenGenerator): + def _make_hash_value(self, user, timestamp): + return ( + str(user.pk) + str(timestamp) + str(user.is_active) + ) + +account_activation_token = TokenGenerator() diff --git a/tournaments/urls.py b/tournaments/urls.py index 72b4be7..6bd253c 100644 --- a/tournaments/urls.py +++ b/tournaments/urls.py @@ -23,4 +23,5 @@ urlpatterns = [ ]) ), path('players/', views.players, name='players'), + path('activate///', views.activate, name='activate'), ] diff --git a/tournaments/views.py b/tournaments/views.py index 6d4021c..b034e5f 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -1,5 +1,8 @@ from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse +from django.utils.encoding import force_str +from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode +from .tokens import account_activation_token from tournaments.models import group_stage from .serializers import ClubSerializer, TournamentSerializer, UserSerializer, ChangePasswordSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, LiveMatchSerializer @@ -164,6 +167,19 @@ def tournament_live_group_stage_json(request, tournament_id): def players(request): return render(request, 'tournaments/test.html') +def activate(request, uidb64, token): + try: + uid = force_str(urlsafe_base64_decode(uidb64)) + user = CustomUser.objects.get(pk=uid) + except(TypeError, ValueError, OverflowError, CustomUser.DoesNotExist): + user = None + if user is not None and account_activation_token.check_token(user, token): + user.is_active = True + user.save() + return HttpResponse('Thank you for your email confirmation. Now you can login your account.') + else: + return HttpResponse('Activation link is invalid!') + ##### API ##### @api_view(['GET'])