diff --git a/django_accounts_app/README.md b/django_accounts_app/README.md index b87e139..be48693 100644 --- a/django_accounts_app/README.md +++ b/django_accounts_app/README.md @@ -18,6 +18,7 @@ from server.settings.components import config ACCOUNT_ACTIVATION_DAYS = 2 EMAIL_TIMEOUT = 20 +CONFIRM_REGISTRATION_BY_EMAIL = True EMAIL_HOST = config('EMAIL_HOST') EMAIL_PORT = config('EMAIL_PORT', cast=int) diff --git a/django_accounts_app/models.py b/django_accounts_app/models.py index 0c01452..4bdbce1 100644 --- a/django_accounts_app/models.py +++ b/django_accounts_app/models.py @@ -1,6 +1,10 @@ from django.db import models from django.contrib.auth.models import AbstractUser from .managers import CustomUserManager +from django.dispatch import receiver +from django.conf import settings +from .tasks import mail_send +from server.settings.components.logging import main_logger class CustomUser(AbstractUser): @@ -22,44 +26,51 @@ class CustomUser(AbstractUser): return self.username -# # ----- ToDO: Enable this to email verification -------- -# -# from django.dispatch import receiver -# from django.conf import settings -# from .tasks import mail_send -# from server.settings.components.logging import main_logger -# -# -# def user_tokens() -> dict: -# -# tokens_dict = dict() -# -# def generate_token(token_length: int) -> str: -# from random import choice -# token_chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890' -# generated_token = '' -# for i in range(token_length): -# generated_token += choice(token_chars) -# return generated_token -# -# tokens_dict['activation_token'] = generate_token(token_length=20) -# -# return tokens_dict -# -# -# @receiver(models.signals.post_save, sender=CustomUser) -# def post_save_user_signal_handler(sender, instance, created, **kwargs): -# -# if created and instance.username != 'admin': -# instance.activation_token = user_tokens()['activation_token'] -# instance.save() -# try: -# user = CustomUser.objects.get(username=instance.username) -# email = instance.email -# subject = 'Welcome to book bot administration' -# username = f'{instance.first_name} {instance.last_name}' -# text = f'https://{settings.DOMAIN_NAME}/accounts/complete_registration/{user.activation_token}' -# -# mail_send(to_email=email, subject=subject, username=username, text_content=text) -# except Exception as e: -# main_logger.error(f'Email not send to user {instance.username}. Reason: {e}') +def user_tokens() -> dict: + tokens_dict = dict() + + def generate_token(token_length: int) -> str: + from random import choice + token_chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890' + generated_token = '' + for i in range(token_length): + generated_token += choice(token_chars) + return generated_token + + tokens_dict['activation_token'] = generate_token(token_length=20) + tokens_dict['verification_code'] = generate_token(token_length=10) + try: + users = CustomUser.objects.all().values('activation_token', 'verification_code') + for user in users: + if tokens_dict['activation_token'] == user['activation_token']: + tokens_dict['activation_token'] = generate_token(token_length=20) + if tokens_dict['verification_code'] == user['verification_code']: + tokens_dict['verification_code'] = generate_token(token_length=10) + return tokens_dict + except Exception as e: + main_logger.error(f'Cant create tokens because they are not unique. ' + f'Activation token: {tokens_dict["activation_token"]} ' + f'Verification code:{tokens_dict["verification_code"]}' + f'\nError: {e}') + + +# # Send email to user +@receiver(models.signals.post_save, sender=CustomUser) +def send_activation_letter(sender, instance, created, **kwargs): + if created and instance.username != 'admin': + username = f'{instance.first_name} {instance.last_name}' + subject = 'Welcome to book bot administration' + email = instance.email + try: + if settings.CONFIRM_REGISTRATION_BY_EMAIL: + instance.activation_token = user_tokens()['activation_token'] + instance.verification_code = user_tokens()['verification_code'] + instance.save() + user = CustomUser.objects.get(username=instance.username) + text = f'https://{settings.DOMAIN_NAME}/accounts/complete_registration/{user.activation_token}' + mail_send(to_email=email, subject=subject, username=username, text_content=text) + else: + instance.is_staff = True + mail_send(to_email=email, subject=subject, username=username) + except Exception as e: + main_logger.error(f'Email not send to user {instance.username}. Reason: {e}') diff --git a/django_accounts_app/templates/registration/info.html b/django_accounts_app/templates/registration/info.html index 8ad6c80..50655c5 100644 --- a/django_accounts_app/templates/registration/info.html +++ b/django_accounts_app/templates/registration/info.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} diff --git a/django_accounts_app/templates/registration/login.html b/django_accounts_app/templates/registration/login.html index a8203ca..3114262 100644 --- a/django_accounts_app/templates/registration/login.html +++ b/django_accounts_app/templates/registration/login.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} @@ -104,9 +104,11 @@ body { {% endif %} +
Добро пожаловать, {{username}}!
+ {% if text_content %}Чтобы активировать учётную запись перейдите по ссылке: Завершить регистрацию
+ {% endif %}