134 lines
3.0 KiB
Python
134 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"
|
|
)
|
|
]
|