from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.utils import timezone
from my_holiday.accounts.managers import MyHolidayUserManager
def validate_password(password):
if len(password) < 6:
raise ValidationError(_("Password must be at least 6 characters long."))
has_letter = any(char.isalpha() for char in password)
if not has_letter:
raise ValidationError(_("Password must contain at least one letter."))
has_digit = any(char.isdigit() for char in password)
if not has_digit:
raise ValidationError(_("Password must contain at least one digit."))
has_underscore = '_' in password
if not has_underscore:
raise ValidationError(_("Password must contain at least one underscore."))
class MyHolidayUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
_("email address"),
unique=True,
error_messages={
"unique": _("A user with that email already exists."),
},
)
date_joined = models.DateTimeField(_("date joined"), default=timezone.now)
is_staff = models.BooleanField(
default=False,
)
is_active = models.BooleanField(
default=True,
)
USERNAME_FIELD = "email"
objects = MyHolidayUserManager()
def save(self, *args, **kwargs):
validate_password(self.password)
super().save(*args, **kwargs)
def __str__(self):
return self.email
class Profile(models.Model):
MAX_LENGTH_FIRST_NAME = 50
MAX_LENGTH_LAST_NAME = 50
first_name = models.CharField(
max_length=MAX_LENGTH_FIRST_NAME,
null=True,
blank=True,
verbose_name='First Name',
)
last_name = models.CharField(
max_length=MAX_LENGTH_LAST_NAME,
null=True,
blank=True,
verbose_name='Last Name',
)
age = models.IntegerField(
null=True,
blank=True,
verbose_name='Age',
)
profile_photo = models.URLField(
null=True,
blank=True,
verbose_name='Profile Photo',
)
user = models.OneToOneField(
MyHolidayUser,
primary_key=True,
on_delete=models.CASCADE,
)