models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
#
from .managers import UserManager
class User(AbstractBaseUser, PermissionsMixin):
GENDER_CHOICES = (
('M', 'Masculino'),
('F', 'Femenino'),
('O', 'Otros'),
)
username = models.CharField(max_length=10, unique=True)
email = models.EmailField()
nombres = models.CharField(max_length=30, blank=True)
apellidos = models.CharField(max_length=30, blank=True)
genero = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
codregistro = models.CharField(max_length=6, blank=True)
#
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email',]
objects = UserManager()
def get_short_name(self):
return self.username
def get_full_name(self):
return self.nombres + ' ' + self.apellidos
functions.py
# funciones extra de la aplicacion users
import random
import string
def code_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
views.py
class UserRegisterView(FormView):
template_name = 'users/register.html'
form_class = UserRegisterForm
success_url = '/'
def form_valid(self, form):
# generamos el codigo
codigo = code_generator()
#
usuario = User.objects.create_user(
form.cleaned_data['username'],
form.cleaned_data['email'],
form.cleaned_data['password1'],
nombres=form.cleaned_data['nombres'],
apellidos=form.cleaned_data['apellidos'],
genero=form.cleaned_data['genero'],
codregistro=codigo
)
# enviar el codigo al email del user
asunto = 'Confrimacion d eemail'
mensaje = 'Codigo de verificacion: ' + codigo
email_remitente = 'roberthbardales@gmail.com'
#
send_mail(asunto, mensaje, email_remitente, [form.cleaned_data['email'],])
# redirigir a pantalla de valdiacion
return HttpResponseRedirect(
reverse(
'users_app:user-verification',
kwargs={'pk': usuario.id}
)
)
forms.py
class VerificationForm(forms.Form):
codregistro = forms.CharField(required=True)
def __init__(self, pk, *args, **kwargs):
self.id_user = pk
super(VerificationForm, self).__init__(*args, **kwargs)
def clean_codregistro(self):
codigo = self.cleaned_data['codregistro']
if len(codigo) == 6:
# verificamos si el codigo y el id de usuario son validos:
activo = User.objects.cod_validation(
self.id_user,
codigo
)
if not activo:
raise forms.ValidationError('el codigo es incorrecto')
else:
raise forms.ValidationError('el codigo es incorrecto')
urls.py
path(
'user-verification/<pk>/',
views.CodeVerificationView.as_view(),
name='user-verification',
),
local.py
from .base import *
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': get_secret('DB_NAME'),
'USER': get_secret('USER'),
'PASSWORD': get_secret('PASSWORD'),
'HOST': 'localhost',
'PORT': '5432',
}
}
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR.child('static')]
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.child('media')
# EMAIL SETTINGS
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = get_secret('EMAIL')
EMAIL_HOST_PASSWORD = get_secret('PASS_EMAIL')
EMAIL_PORT = 587
secret.json
{
"FILENAME": "secret.json",
"SECRET_KEY": "7%sp*+l6*i@t-8*)$nf1u^)9w_o8yz^bw7xu1rrmwx_o(t$#c1",
"DB_NAME": "dbuser",
"USER": "neunapp",
"PASSWORD": "neunapp2020",
"EMAIL": "roberthbardales@gmail.com",
"PASS_EMAIL": "xqvuzdqwirflsxog"
}
templates/users/verification.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Verificacion de email</h1>
<h3>Ingre el codigo de Verificacion:</h3>
<form method="post">{% csrf_token %}
{{form.as_p}}
<button type="submit">Confirmar</button>
</form>
</body>
</html>
Para que funcione de debe tener activado la verificacion de dos pasos de la cuenta de google






y finalmente se accede al sistema
Última modificación: 27 Dec 2022 12:20
No hay comentarios aún
Sé el primero en comentar este artículo