Files
state-corp-backend/src/apps/user/models.py
Aleksandr Meshchriakov 345b1d0cc8
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 45s
CI/CD Pipeline / Code Quality Checks (push) Failing after 48s
CI/CD Pipeline / Build Docker Images (push) Has been skipped
CI/CD Pipeline / Push to Gitea Registry (push) Has been skipped
CI/CD Pipeline / Deploy to Server (push) Has been skipped
Add initial implementations for forms and organization apps with serializers, factories, and admin configurations
2026-03-28 18:23:06 +01:00

112 lines
3.4 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)
mid_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.mid_name, self.last_name]
full_name = " ".join(part for part in parts if part)
return full_name or self.user.username