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" ) ]