Quiz

Форк
0
/
models.py 
71 строка · 3.2 Кб
1
from django.db import models
2
from django.contrib.auth.models import AbstractUser
3
from django.utils.translation import gettext_lazy as _
4
from django.core.validators import MaxValueValidator, MinValueValidator
5
from games.models import Lobby, Game
6
from questions.models import Question
7

8
NULLABLE = {"blank": True, "null": True}
9

10

11
class AuthUser(AbstractUser):
12

13
    RANKS = (
14
        ('iron', 'Железо'),
15
        ('bronze', 'Бронза'),
16
        ('silver', 'Серебро'),
17
        ('gold', 'Золото'),
18
        ('platinum', 'Платина'),
19
        ('diamond', 'Алмаз'),
20
        ('master', 'Мастер'),
21
        ('grandmaster', 'Грандмастер'),
22
        ('challenger', 'Претендент')
23
    )
24

25
    nickname = models.CharField(max_length=16, verbose_name='Ник')
26
    telegram_id = models.PositiveIntegerField(verbose_name='ID Телеграм', **NULLABLE)
27
    email = models.EmailField(verbose_name='email', **NULLABLE)
28
    birthdate = models.DateField(verbose_name='Дата рождения', null=True)
29
    is_moderator = models.BooleanField(default=False, verbose_name='Модератор')
30
    level = models.PositiveSmallIntegerField(default=1, verbose_name='Уровень')
31
    current_experience = models.PositiveSmallIntegerField(default=0, verbose_name='Опыт текущего уровня')
32
    rank = models.CharField(choices=RANKS, default=RANKS[0], max_length=16, verbose_name='Ранг')
33
    division = models.PositiveSmallIntegerField(default=4, verbose_name='Дивизион', validators=[
34
            MaxValueValidator(4),
35
            MinValueValidator(1)
36
        ])
37
    current_lp = models.PositiveSmallIntegerField(default=0, verbose_name='Текущие ранговые очки')
38
    friends = models.ManyToManyField('self', verbose_name='Друзья')
39
    current_lobby = models.ForeignKey(Lobby, related_name='players', on_delete=models.SET_NULL, **NULLABLE)
40
    is_lobby_leader = models.BooleanField(default=False)
41
    current_game = models.ForeignKey(Game, on_delete=models.SET_NULL, null=True, blank=True)
42
    avatar = models.ImageField(upload_to="users", verbose_name=_("Аватар"), **NULLABLE)
43

44
    @property
45
    def get_friends(self):
46
        return AuthUser.objects.filter(pk__in=self.friends.values_list('pk'))
47

48

49
class QuestionRatedByUser(models.Model):
50
    """
51
    Модель для связи вопроса с пользователем.
52
    Каждая запись - факт оценки вопроса пользователем.
53
    """
54
    question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name='Вопрос')
55
    user = models.ForeignKey(AuthUser, on_delete=models.CASCADE, verbose_name='Пользователь')
56

57
    class Meta:
58
        unique_together = ('question', 'user',)
59

60

61
class Remark(models.Model):
62
    question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name='Вопрос')
63
    text = models.CharField(max_length=128, verbose_name='Замечание')
64
    author = models.ForeignKey(AuthUser, on_delete=models.CASCADE, verbose_name='Пользователь')
65
    rating = models.IntegerField(default=0, verbose_name='Очки')
66

67
    class Meta:
68
        unique_together = ('question', 'author',)
69

70
    def __str__(self):
71
        return f'#{self.text} {self.rating}'

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.