from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import gettext_lazy as _ class User(AbstractUser): """Расширенная модель пользователя""" # Убираем first_name и last_name из модели User (они в Profile) first_name = None last_name = None # Переопределяем группы и разрешения для избежания конфликта groups = models.ManyToManyField( "auth.Group", verbose_name=_("groups"), blank=True, help_text=_(""), related_name="custom_user_set", related_query_name="custom_user", ) user_permissions = models.ManyToManyField( "auth.Permission", verbose_name=_("user permissions"), blank=True, help_text=_("Specific permissions for this user."), related_name="custom_user_set", related_query_name="custom_user", ) email = models.EmailField( _("email address"), unique=True, help_text=_("Required. Must be unique.") ) phone = models.CharField( _("phone number"), max_length=20, blank=True, null=True, help_text=_("Phone number in international format"), ) is_verified = models.BooleanField( _("email verified"), default=False, help_text=_("Designates whether the user has verified their email."), ) created_at = models.DateTimeField(_("created at"), auto_now_add=True) updated_at = models.DateTimeField(_("updated at"), auto_now=True) USERNAME_FIELD = "username" REQUIRED_FIELDS = ["email"] class Meta: db_table = "users" verbose_name = _("user") verbose_name_plural = _("users") ordering = ["-created_at"] def __str__(self): return f"{self.username} ({self.email})" class Profile(models.Model): """Профиль пользователя (OneToOne связь с User)""" user = models.OneToOneField( User, on_delete=models.CASCADE, related_name="profile", verbose_name=_("user") ) first_name = models.CharField(_("first name"), max_length=50, blank=True, null=True) middle_name = models.CharField( _("middle name"), max_length=50, blank=True, null=True, ) last_name = models.CharField(_("last name"), max_length=50, blank=True, null=True) bio = models.TextField( _("bio"), blank=True, null=True, help_text=_("Short biography or description") ) avatar = models.ImageField( _("avatar"), upload_to="avatars/", blank=True, null=True, help_text=_("User avatar image"), ) date_of_birth = models.DateField(_("date of birth"), blank=True, null=True) created_at = models.DateTimeField(_("created at"), auto_now_add=True) updated_at = models.DateTimeField(_("updated at"), auto_now=True) class Meta: db_table = "profiles" verbose_name = _("profile") verbose_name_plural = _("profiles") ordering = ["-created_at"] def __str__(self): return f"Profile of {self.user.username}" @property def full_name(self): """Полное имя пользователя""" parts = [self.first_name, self.middle_name, self.last_name] full_name = " ".join(part for part in parts if part) if full_name: return full_name return self.user.username