Quiz

Форк
0
/
operations.py 
132 строки · 4.7 Кб
1
import os
2
import django
3
from django.db.models import Q
4
from typing import List
5

6
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dnt.settings')
7
django.setup()
8

9
from authapp.models import AuthUser, QuestionRatedByUser, Remark
10
from questions.models import Question
11

12
MIN_LEVEL_TO_RATE_QUESTION = 5
13

14

15
class UserLevelTooLow(Exception):
16
    pass
17

18

19
class NoUnratedQuestionsForUser(Exception):
20
    pass
21

22

23
class AlreadyRemarkedByThisUser(Exception):
24
    pass
25

26

27
class SettingRatingToQuestionByUser:
28
    """
29
    Класс для операций пользователя с вопросами: оценка вопроса, просмотр замечаний, оценка замечаний
30

31
    TODO Что еще нужно доделать ближе к релизу:
32
    - не давать пользователю оценивать вопросы, заведенные им (допилить модель вопроса и логику)
33
    """
34

35
    def __init__(self, user: AuthUser):
36
        """
37
        Создание объекта процесса оценки.
38
        Создается для конкретного пользователя
39
        """
40
        if user.level >= MIN_LEVEL_TO_RATE_QUESTION:
41
            self.user = user
42
            self.current_question = None
43
            self.get_next_question()
44
        else:
45
            raise UserLevelTooLow
46

47
    def get_next_question(self):
48
        """
49
        Метод перехода к следующему вопросу
50
        """
51
        already_rated_questions = QuestionRatedByUser.objects.filter(user_id=self.user.pk)
52
        not_yet_rated_questions = Question.objects.exclude(
53
            pk__in=[question.question_id for question in already_rated_questions])
54
        if not_yet_rated_questions:
55
            self.current_question = not_yet_rated_questions[0]
56
        else:
57
            self.current_question = None
58
            raise NoUnratedQuestionsForUser
59

60
    def rate_current_question(self, bad: bool = False):
61
        """
62
        Метод для оценки текущего вопроса
63
        :param bad: Dislike если True, Like если False (по умолчанию)
64
        :return:
65
        """
66
        if not bad:
67
            self.current_question.rating += 1
68
        else:
69
            self.current_question.rating -= 1
70
        self.current_question.save()
71
        question_rated_by_user = QuestionRatedByUser(question=self.current_question,
72
                                                     user=self.user)
73
        question_rated_by_user.save()
74

75
    def ability_to_remark_question(self):
76
        try:
77
            Remark.objects.get(question_id=self.current_question.pk,
78
                               author_id=self.user.pk)
79
            return False
80
        except Remark.DoesNotExist:
81
            return True
82

83
    def add_remark_to_current_question(self, text: str):
84
        """
85
        Метод для добавления замечания к текущему вопросу
86
        :param text: Текст замечания
87
        :return:
88
        """
89
        if self.ability_to_remark_question():
90
            remark = Remark(question=self.current_question,
91
                            text=text,
92
                            author=self.user)
93
            remark.save()
94
        else:
95
            raise AlreadyRemarkedByThisUser
96

97
    def get_remarks_for_current_question(self) -> List[Remark]:
98
        """
99
        Метод получения объектов замечаний к текущему вопросу.
100
        Фильтрует замечания просящего пользователя, чтобы он не мог оценивать свои же.
101
        :return:
102
        """
103
        return Remark.objects.filter(~Q(author=self.user.pk), question=self.current_question)
104

105
    @staticmethod
106
    def rate_remark(remark: Remark, bad: bool = False):
107
        """
108
        Метод оценки замечания
109
        :param remark: Объект замечания
110
        :param bad:  Dislike если True, Like если False (по умолчанию)
111
        :return:
112
        """
113
        if not bad:
114
            remark.rating += 1
115
        else:
116
            remark.rating -= 1
117
        remark.save()
118

119

120
if __name__ == '__main__':
121
    # Тестирование
122
    user = AuthUser.objects.get(username='taraskvitko')
123
    process = SettingRatingToQuestionByUser(user)
124
    # process.get_next_question()
125
    print(process.current_question.question)
126
    # process.rate_current_question(bad=False)
127
    # process.add_remark_to_current_question(text='Вообще тлен')
128
    # for remark in process.get_remarks_for_current_question():
129
    #     print(remark.text)
130
    # remark = process.get_remarks_for_current_question()[0]
131
    # print(remark.text)
132
    # process.rate_remark(remark=remark, bad=True)
133

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

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

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

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