Files
mostovik-backend/src/apps/user/models.py

119 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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