added EMAIL_CONFIRM enviroment constant

This commit is contained in:
Dmitry Afanasyev 2021-10-27 23:43:40 +03:00
parent 1b19a007ae
commit 4cde734f4d
11 changed files with 72 additions and 51 deletions

View File

@ -18,6 +18,7 @@ from server.settings.components import config
ACCOUNT_ACTIVATION_DAYS = 2 ACCOUNT_ACTIVATION_DAYS = 2
EMAIL_TIMEOUT = 20 EMAIL_TIMEOUT = 20
CONFIRM_REGISTRATION_BY_EMAIL = True
EMAIL_HOST = config('EMAIL_HOST') EMAIL_HOST = config('EMAIL_HOST')
EMAIL_PORT = config('EMAIL_PORT', cast=int) EMAIL_PORT = config('EMAIL_PORT', cast=int)

View File

@ -1,6 +1,10 @@
from django.db import models from django.db import models
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from .managers import CustomUserManager 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): class CustomUser(AbstractUser):
@ -22,44 +26,51 @@ class CustomUser(AbstractUser):
return self.username return self.username
# # ----- ToDO: Enable this to email verification -------- def user_tokens() -> dict:
# tokens_dict = dict()
# from django.dispatch import receiver
# from django.conf import settings def generate_token(token_length: int) -> str:
# from .tasks import mail_send from random import choice
# from server.settings.components.logging import main_logger token_chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
# generated_token = ''
# for i in range(token_length):
# def user_tokens() -> dict: generated_token += choice(token_chars)
# return generated_token
# tokens_dict = dict()
# tokens_dict['activation_token'] = generate_token(token_length=20)
# def generate_token(token_length: int) -> str: tokens_dict['verification_code'] = generate_token(token_length=10)
# from random import choice try:
# token_chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890' users = CustomUser.objects.all().values('activation_token', 'verification_code')
# generated_token = '' for user in users:
# for i in range(token_length): if tokens_dict['activation_token'] == user['activation_token']:
# generated_token += choice(token_chars) tokens_dict['activation_token'] = generate_token(token_length=20)
# return generated_token if tokens_dict['verification_code'] == user['verification_code']:
# tokens_dict['verification_code'] = generate_token(token_length=10)
# tokens_dict['activation_token'] = generate_token(token_length=20) return tokens_dict
# except Exception as e:
# return tokens_dict 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"]}'
# @receiver(models.signals.post_save, sender=CustomUser) f'\nError: {e}')
# def post_save_user_signal_handler(sender, instance, created, **kwargs):
#
# if created and instance.username != 'admin': # # Send email to user
# instance.activation_token = user_tokens()['activation_token'] @receiver(models.signals.post_save, sender=CustomUser)
# instance.save() def send_activation_letter(sender, instance, created, **kwargs):
# try: if created and instance.username != 'admin':
# user = CustomUser.objects.get(username=instance.username) username = f'{instance.first_name} {instance.last_name}'
# email = instance.email subject = 'Welcome to book bot administration'
# subject = 'Welcome to book bot administration' email = instance.email
# username = f'{instance.first_name} {instance.last_name}' try:
# text = f'https://{settings.DOMAIN_NAME}/accounts/complete_registration/{user.activation_token}' if settings.CONFIRM_REGISTRATION_BY_EMAIL:
# instance.activation_token = user_tokens()['activation_token']
# mail_send(to_email=email, subject=subject, username=username, text_content=text) instance.verification_code = user_tokens()['verification_code']
# except Exception as e: instance.save()
# main_logger.error(f'Email not send to user {instance.username}. Reason: {e}') 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}')

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}
@ -104,9 +104,11 @@ body {
<input type="text" class="form-control" name="username" placeholder="Username" required="required"> <input type="text" class="form-control" name="username" placeholder="Username" required="required">
{% endif %} {% endif %}
</div> </div>
<div class="form-group">{{ form.username.errors }}</div>
<div class="form-group"> <div class="form-group">
<input type="password" class="form-control" name="password" placeholder="Password" required="required"> <input type="password" class="form-control" name="password" placeholder="Password" required="required">
</div> </div>
<div class="form-group">{{ form.password.errors }}</div>
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary btn-lg">Login</button> <button type="submit" class="btn btn-primary btn-lg">Login</button>
</div> </div>

View File

@ -2,7 +2,9 @@
<body> <body>
<div> <div>
<p style="color: green">Добро пожаловать, {{username}}!</p> <p style="color: green">Добро пожаловать, {{username}}!</p>
{% if text_content %}
<p style="color: green">Чтобы активировать учётную запись перейдите по ссылке: <p style="color: green">Чтобы активировать учётную запись перейдите по ссылке:
<a href="{{text_content}}">Завершить регистрацию</a></p> <a href="{{text_content}}">Завершить регистрацию</a></p>
{% endif %}
</div> </div>
</body> </body>

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}

View File

@ -7,9 +7,9 @@ from server.apps.accounts.forms import CustomUserCreationForm
from server.apps.accounts.models import CustomUser from server.apps.accounts.models import CustomUser
from django.core.validators import validate_email from django.core.validators import validate_email
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings
# Create your views here.
def dashboard(request: HttpRequest) -> HttpResponse: def dashboard(request: HttpRequest) -> HttpResponse:
return render(request, "users/dashboard.html", {}) return render(request, "users/dashboard.html", {})
@ -38,8 +38,13 @@ class RegisterUser(CreateView):
def form_valid(self, form: BaseModelForm) -> HttpResponse: def form_valid(self, form: BaseModelForm) -> HttpResponse:
if self.request.recaptcha_is_valid: if self.request.recaptcha_is_valid:
form.save() user = form.save()
validate_email(form.instance.email) validate_email(form.instance.email)
if settings.CONFIRM_REGISTRATION_BY_EMAIL:
message = 'Please check your email for continue registration' message = 'Please check your email for continue registration'
return render(self.request, 'registration/info.html', {'message': message}) 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()) return render(self.request, 'users/register.html', self.get_context_data())