from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin, send_mail
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from pythonpro.core.managers import UserManager
class User(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
admin-compliant permissions.
Username and password are required. Other fields are optional.
"""
first_name = models.CharField(_('first name'), max_length=30)
email = models.EmailField(_('email address'), unique=True, error_messages={
'unique': _("A user with that username already exists."),
})
is_staff = models.BooleanField(
_('staff status'),
default=False,
help_text=_('Designates whether the user can log into this admin site.'),
)
is_active = models.BooleanField(
_('active'),
default=True,
help_text=_(
'Designates whether this user should be treated as active. '
'Unselect this instead of deleting accounts.'
),
)
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
source = models.CharField(_('source'), max_length=255, default='unknown')
objects = UserManager()
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def clean(self):
super().clean()
self.email = self.__class__.objects.normalize_email(self.email)
def get_full_name(self):
"""
Return the first_name plus the last_name, with a space in between.
"""
return self.get_short_name()
def get_short_name(self):
"""Return the short name for the user."""
return self.first_name
def email_user(self, subject, message, from_email=None, **kwargs):
"""Send an email to this user."""
send_mail(subject, message, from_email, [self.email], **kwargs)
class UserInteraction(models.Model):
"""
Class representing User important interactions on platform. The goal is to extract metrics about user behaviour
"""
class Meta:
indexes = [
models.Index(fields=['user', 'creation']),
models.Index(fields=['category', '-creation']),
]
verbose_name = 'Histórico de Usuário'
verbose_name_plural = 'Históricos de Usuários'
BECOME_DATA_SCIENTIST = 'BECOME_DATA_SCIENTIST'
BECOME_LEAD = 'BECOME_LEAD'
ACTIVATED = 'ACTIVATED'
CLIENT_LP = 'CLIENT_LP'
CLIENT_CHECKOUT = 'CLIENT_CHECKOUT'
CLIENT_CHECKOUT_FORM = 'CLIENT_CHECKOUT_FORM'
CLIENT_BOLETO = 'CLIENT_BOLETO'
BECOME_CLIENT = 'BECOME_CLIENT'
MEMBER_LP = 'MEMBER_LP'
MEMBER_CHECKOUT = 'MEMBER_CHECKOUT'
MEMBER_CHECKOUT_FORM = 'MEMBER_CHECKOUT_FORM'
MEMBER_BOLETO = 'MEMBER_BOLETO'
WAITING_LIST = 'WAITING_LIST'
BECOME_MEMBER = 'BECOME_MEMBER'
BECOME_BOOTCAMPER = 'BECOME_BOOTCAMPER'
BECOME_PYTHONISTA = 'BECOME_PYTHONISTA'
WEBDEV_CHECKOUT_FORM = 'WEBDEV_CHECKOUT_FORM'
BECOME_WEBDEV = 'BECOME_WEBDEV'
BECOME_FELLOW = 'BECOME_FELLOW'
LAUNCH_LP = 'LAUNCH_LP'
LAUNCH_SUBSCRIPTION = 'LAUNCH_SUBSCRIPTION'
CPL1 = 'CPL1'
CPL2 = 'CPL2'
CPL3 = 'CPL3'
user = models.ForeignKey(User, on_delete=models.CASCADE)
creation = models.DateTimeField(auto_now_add=True)
category = models.CharField(
max_length=32,
choices=(
(
(BECOME_LEAD, 'User become Lead'),
(ACTIVATED, 'User Watched first video class'),
(CLIENT_LP, 'User visited Client Landing Page'),
(CLIENT_CHECKOUT, 'User clicked on Client checkout button'),
(CLIENT_CHECKOUT_FORM, 'User Filled Client Checkout form'),
(CLIENT_BOLETO, 'User generated a Client Boleto'),
(BECOME_CLIENT, 'User become Client'),
(MEMBER_LP, 'User visited Member Landing Page'),
(MEMBER_CHECKOUT, 'User clicked on Member checkout Button'),
(MEMBER_CHECKOUT_FORM, 'User Filled Member Checkout form'),
(WEBDEV_CHECKOUT_FORM, 'User Filled Webdev Checkout form'),
(MEMBER_BOLETO, 'User generate Member Boleto'),
(WAITING_LIST, 'User subscribed to Waiting List'),
(BECOME_MEMBER, 'User Become Member'),
(BECOME_BOOTCAMPER, 'User Become Bootcamper'),
(BECOME_PYTHONISTA, 'User Become Pythonista'),
(BECOME_WEBDEV, 'User Become Webdev'),
(LAUNCH_LP, 'User visited Launch Landing Page'),
(LAUNCH_SUBSCRIPTION, 'User subscribed to launch'),
(CPL1, 'User Visited CPL1'),
(CPL2, 'User Visited CPL2'),
(CPL3, 'User Visited CPL3'),
(BECOME_DATA_SCIENTIST, 'User Become Data Scientist'),
)
)
)
source = models.CharField(blank=True, null=True, max_length=32, help_text='Traffic source origin')