Files

133 lines
3.0 KiB
Python

import uuid
from django.contrib.auth import models as auth_models
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.core.validators import RegexValidator
from ..choices import RoleChoice
from ..managers import UserManager
phone_validator = RegexValidator(
regex=r'^\+?[1-9]\d{1,14}$',
message=_(
"Enter a valid international phone number "
"(E.164 format, e.g., +14155552671)."
)
)
class User(auth_models.AbstractUser):
id = models.UUIDField(
_("ID"),
primary_key=True,
default=uuid.uuid4,
editable=False
)
phone = models.CharField(
max_length=255,
validators=[
phone_validator
],
unique=True
)
username = models.CharField(
max_length=255,
null=True,
blank=True
)
validated_at = models.DateTimeField(
null=True,
blank=True
)
inn_code = models.CharField(
max_length=12,
null=True,
blank=True
)
first_name = models.CharField(
_("First Name"),
max_length=150,
blank=False,
null=False,
)
last_name = models.CharField(
_("Last Name"),
max_length=150,
blank=False,
null=False
)
email = models.EmailField(
_("Email Address"),
blank=True,
)
role = models.CharField(
_("Role"),
max_length=255,
choices=RoleChoice,
default=RoleChoice.USER,
)
created_at = models.DateTimeField(
verbose_name=_("Created At"),
auto_now_add=True
)
updated_at = models.DateTimeField(
verbose_name=_("Updated At"),
auto_now=True
)
USERNAME_FIELD = "phone"
REQUIRED_FIELDS = [
"first_name",
"last_name",
*auth_models.AbstractUser.REQUIRED_FIELDS
]
objects = UserManager() # type: ignore
def save(self, *args: object, **kwargs: object):
"""
save method overwriten to make self.role updated
every time when user is made admin or superuser
"""
if self.is_staff:
self.role = RoleChoice.ADMIN
if self.is_superuser:
self.role = RoleChoice.SUPERUSER
else:
self.role = RoleChoice.USER
super().save(*args, **kwargs) # type: ignore
def __str__(self):
return self.phone
@property
def full_name(self) -> str:
return f"{self.first_name} {self.last_name}"
class Meta:
db_table = "users"
verbose_name = _("User")
verbose_name_plural = _("Users")
indexes = [
models.Index(
fields=["phone"],
name="users_phone_inx"
),
models.Index(
fields=["email"],
name="users_email_inx",
),
models.Index(
fields=["inn_code"],
name="users_inn_code_inx"
)
]