53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from django.contrib.auth.models import AbstractUser
|
|
from django.db import models
|
|
|
|
|
|
class Role(models.TextChoices):
|
|
"""Роли пользователей (ТЗ §2)."""
|
|
|
|
BUYER = 'buyer', 'Покупатель'
|
|
SELLER = 'seller', 'Продавец'
|
|
MODERATOR = 'moderator', 'Модератор'
|
|
ADMIN = 'admin', 'Администратор'
|
|
PARTNER = 'partner', 'Партнёр (Росмолодёжь)'
|
|
|
|
|
|
class User(AbstractUser):
|
|
"""Пользователь площадки (ТЗ §4: User)."""
|
|
|
|
role = models.CharField(
|
|
'Роль', max_length=20, choices=Role.choices, default=Role.BUYER,
|
|
)
|
|
full_name = models.CharField('ФИО', max_length=255, blank=True)
|
|
phone = models.CharField('Телефон', max_length=32, blank=True)
|
|
birth_date = models.DateField('Дата рождения', null=True, blank=True)
|
|
region = models.CharField('Регион', max_length=120, blank=True)
|
|
pd_consent = models.BooleanField(
|
|
'Согласие на обработку ПДн', default=False,
|
|
)
|
|
|
|
class Meta:
|
|
verbose_name = 'Пользователь'
|
|
verbose_name_plural = 'Пользователи'
|
|
|
|
def __str__(self):
|
|
return self.full_name or self.username
|
|
|
|
@property
|
|
def is_seller(self):
|
|
return self.role == Role.SELLER
|
|
|
|
@property
|
|
def age(self):
|
|
"""Возвращает возраст в годах или None, если дата не указана."""
|
|
from datetime import date
|
|
|
|
if not self.birth_date:
|
|
return None
|
|
today = date.today()
|
|
return (
|
|
today.year
|
|
- self.birth_date.year
|
|
- ((today.month, today.day) < (self.birth_date.month, self.birth_date.day))
|
|
)
|