from django.contrib.auth.models import User from django.db import models from django.db.models.fields.related import OneToOneField from typing import Optional import uuid from sitemanagement.constants.account_types import account_types, AccountType, AccountTypeLiteral class UserProfile(models.Model): """ Профиль пользователя с дополнительной информацией """ def get_account_type_display(self) -> str: """Автоматически добавляется Django для полей с choices""" ... user: OneToOneField[User] = models.OneToOneField( User, on_delete=models.CASCADE, related_name='userprofile' ) uuid: models.UUIDField = models.UUIDField( default=uuid.uuid4, editable=False, unique=True, null=True ) account_type: models.CharField = models.CharField( max_length=10, verbose_name="Тип аккаунта", choices=account_types, db_index=True ) imageURL: models.CharField = models.CharField( max_length=255, null=True, blank=True, verbose_name="URL изображения профиля" ) class Meta: verbose_name = "Профиль пользователя" verbose_name_plural = "Профили пользователей" def __str__(self) -> str: return f"{self.user.first_name} ({self.get_account_type_display()})" @property def short_uuid(self) -> Optional[str]: """Возвращает первые 6 символов UUID или None, если UUID не установлен""" return str(self.uuid)[:6] if self.uuid else None def get_account_type(self) -> AccountTypeLiteral: """Возвращает тип аккаунта пользователя""" return AccountType(self.account_type).value