From 4cde734f4d146bb13dbfdb5b7b77989e43178714 Mon Sep 17 00:00:00 2001 From: Dmitry Afanasyev Date: Wed, 27 Oct 2021 23:43:40 +0300 Subject: [PATCH] added EMAIL_CONFIRM enviroment constant --- django_accounts_app/README.md | 1 + django_accounts_app/models.py | 93 +++++++++++-------- .../templates/registration/info.html | 2 +- .../templates/registration/login.html | 4 +- .../templates/registration/message.html | 2 + .../registration/password_change_done.html | 2 +- .../registration/password_change_form.html | 2 +- .../templates/{ => users}/base.html | 0 .../templates/users/dashboard.html | 2 +- .../templates/users/register.html | 2 +- django_accounts_app/views.py | 13 ++- 11 files changed, 72 insertions(+), 51 deletions(-) rename django_accounts_app/templates/{ => users}/base.html (100%) 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 %} +
{{ form.username.errors }}
+
{{ form.password.errors }}
diff --git a/django_accounts_app/templates/registration/message.html b/django_accounts_app/templates/registration/message.html index 08568df..c888c0d 100644 --- a/django_accounts_app/templates/registration/message.html +++ b/django_accounts_app/templates/registration/message.html @@ -2,7 +2,9 @@

Добро пожаловать, {{username}}!

+ {% if text_content %}

Чтобы активировать учётную запись перейдите по ссылке: Завершить регистрацию

+ {% endif %}
diff --git a/django_accounts_app/templates/registration/password_change_done.html b/django_accounts_app/templates/registration/password_change_done.html index 64d7695..4acc8d5 100644 --- a/django_accounts_app/templates/registration/password_change_done.html +++ b/django_accounts_app/templates/registration/password_change_done.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} diff --git a/django_accounts_app/templates/registration/password_change_form.html b/django_accounts_app/templates/registration/password_change_form.html index 6f3b1f6..8d6d33a 100644 --- a/django_accounts_app/templates/registration/password_change_form.html +++ b/django_accounts_app/templates/registration/password_change_form.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} diff --git a/django_accounts_app/templates/base.html b/django_accounts_app/templates/users/base.html similarity index 100% rename from django_accounts_app/templates/base.html rename to django_accounts_app/templates/users/base.html diff --git a/django_accounts_app/templates/users/dashboard.html b/django_accounts_app/templates/users/dashboard.html index 164543c..7b19648 100644 --- a/django_accounts_app/templates/users/dashboard.html +++ b/django_accounts_app/templates/users/dashboard.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} diff --git a/django_accounts_app/templates/users/register.html b/django_accounts_app/templates/users/register.html index ee2704b..fc23416 100644 --- a/django_accounts_app/templates/users/register.html +++ b/django_accounts_app/templates/users/register.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "users/base.html" %} {% block content %} diff --git a/django_accounts_app/views.py b/django_accounts_app/views.py index d72e026..4f6afa1 100644 --- a/django_accounts_app/views.py +++ b/django_accounts_app/views.py @@ -7,9 +7,9 @@ from server.apps.accounts.forms import CustomUserCreationForm from server.apps.accounts.models import CustomUser from django.core.validators import validate_email from django.core.exceptions import ObjectDoesNotExist +from django.conf import settings -# Create your views here. def dashboard(request: HttpRequest) -> HttpResponse: return render(request, "users/dashboard.html", {}) @@ -38,8 +38,13 @@ class RegisterUser(CreateView): def form_valid(self, form: BaseModelForm) -> HttpResponse: if self.request.recaptcha_is_valid: - form.save() + user = form.save() validate_email(form.instance.email) - message = 'Please check your email for continue registration' - return render(self.request, 'registration/info.html', {'message': message}) + if settings.CONFIRM_REGISTRATION_BY_EMAIL: + message = 'Please check your email for continue registration' + return render(self.request, 'registration/info.html', {'message': message}) + else: + user.backend = 'django.contrib.auth.backends.ModelBackend' + login(self.request, user) + return redirect('admin:index') return render(self.request, 'users/register.html', self.get_context_data())