feat: MVP-скелет площадки (Django + MySQL/SQLite, модели по ТЗ §4, базовые страницы)
This commit is contained in:
1 parent
e5f312a00f
commit
8218a568ce
67 files changed
+1929
No files matched your search
@@ -0,0 +1,49 @@
|
||||
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)
|
||||
|
||||
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))
|
||||
)
|
||||
Reference in new issue
Block a user