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
EMAIL_TIMEOUT = 20
CONFIRM_REGISTRATION_BY_EMAIL = True
EMAIL_HOST = config('EMAIL_HOST')
EMAIL_PORT = config('EMAIL_PORT', cast=int)

View File

@ -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}')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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())