3
from django.db.models import Q
6
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dnt.settings')
9
from authapp.models import AuthUser, QuestionRatedByUser, Remark
10
from questions.models import Question
12
MIN_LEVEL_TO_RATE_QUESTION = 5
15
class UserLevelTooLow(Exception):
19
class NoUnratedQuestionsForUser(Exception):
23
class AlreadyRemarkedByThisUser(Exception):
27
class SettingRatingToQuestionByUser:
29
Класс для операций пользователя с вопросами: оценка вопроса, просмотр замечаний, оценка замечаний
31
TODO Что еще нужно доделать ближе к релизу:
32
- не давать пользователю оценивать вопросы, заведенные им (допилить модель вопроса и логику)
35
def __init__(self, user: AuthUser):
37
Создание объекта процесса оценки.
38
Создается для конкретного пользователя
40
if user.level >= MIN_LEVEL_TO_RATE_QUESTION:
42
self.current_question = None
43
self.get_next_question()
47
def get_next_question(self):
49
Метод перехода к следующему вопросу
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]
57
self.current_question = None
58
raise NoUnratedQuestionsForUser
60
def rate_current_question(self, bad: bool = False):
62
Метод для оценки текущего вопроса
63
:param bad: Dislike если True, Like если False (по умолчанию)
67
self.current_question.rating += 1
69
self.current_question.rating -= 1
70
self.current_question.save()
71
question_rated_by_user = QuestionRatedByUser(question=self.current_question,
73
question_rated_by_user.save()
75
def ability_to_remark_question(self):
77
Remark.objects.get(question_id=self.current_question.pk,
78
author_id=self.user.pk)
80
except Remark.DoesNotExist:
83
def add_remark_to_current_question(self, text: str):
85
Метод для добавления замечания к текущему вопросу
86
:param text: Текст замечания
89
if self.ability_to_remark_question():
90
remark = Remark(question=self.current_question,
95
raise AlreadyRemarkedByThisUser
97
def get_remarks_for_current_question(self) -> List[Remark]:
99
Метод получения объектов замечаний к текущему вопросу.
100
Фильтрует замечания просящего пользователя, чтобы он не мог оценивать свои же.
103
return Remark.objects.filter(~Q(author=self.user.pk), question=self.current_question)
106
def rate_remark(remark: Remark, bad: bool = False):
108
Метод оценки замечания
109
:param remark: Объект замечания
110
:param bad: Dislike если True, Like если False (по умолчанию)
120
if __name__ == '__main__':
122
user = AuthUser.objects.get(username='taraskvitko')
123
process = SettingRatingToQuestionByUser(user)
125
print(process.current_question.question)