33
44from django .db .models import QuerySet
55from drf_spectacular .utils import extend_schema
6+ from progress .models import TaskObjUserResult
67from rest_framework import generics , status
78from rest_framework .permissions import IsAuthenticated
89from rest_framework .response import Response
10+ from subscription .permissions import SubscriptionTaskObjectPermission
911
10- from progress .models import TaskObjUserResult
1112from questions .mapping import TypeQuestionPoints
12- from questions .models import (AnswerConnect , InfoSlide , QuestionConnect ,
13- QuestionSingleAnswer , QuestionWrite )
13+ from questions .models import (
14+ AnswerConnect ,
15+ InfoSlide ,
16+ QuestionConnect ,
17+ QuestionSingleAnswer ,
18+ QuestionWrite ,
19+ )
1420from questions .permissions import CheckQuestionTypePermission
15- from questions .serializers import (ConnectQuestionSerializer ,
16- InfoSlideSerializer ,
17- SingleQuestionAnswerSerializer ,
18- WriteQuestionSerializer )
21+ from questions .serializers import (
22+ ConnectQuestionSerializer ,
23+ InfoSlideSerializer ,
24+ SingleQuestionAnswerSerializer ,
25+ WriteQuestionSerializer ,
26+ )
1927from questions .services .helpers import add_popup_data
20- from questions .typing import (AnswerUserWriteData , QuestionSerializerData ,
21- QuestionWriteSerializerData ,
22- QuestionСonnectSerializerData , SingleAnswerData ,
23- SingleConnectedAnswerData )
24- from subscription .permissions import SubscriptionTaskObjectPermission
28+ from questions .typing import (
29+ AnswerUserWriteData ,
30+ QuestionSerializerData ,
31+ QuestionWriteSerializerData ,
32+ QuestionСonnectSerializerData ,
33+ SingleAnswerData ,
34+ SingleConnectedAnswerData ,
35+ )
2536
2637
2738class QuestionSingleAnswerGet (generics .RetrieveAPIView ):
@@ -37,22 +48,28 @@ class QuestionSingleAnswerGet(generics.RetrieveAPIView):
3748 summary = "Выводит данные для трёх видов вопросов (см. описание)" ,
3849 tags = ["Вопросы и инфо-слайд" ],
3950 description = """для: вопроса с одним правильным ответом, вопроса на исключение,
40- вопроса на выбор нескольких правильных
51+ вопроса на выбор нескольких правильных
4152 ответов (возможно пока его нет, но в будущем может появится).""" ,
4253 )
4354 def get (self , request , * args , ** kwargs ) -> Response :
4455 question : QuestionSingleAnswer = self .request_question
45- all_answers = question .single_answers .all ()
46- answers = [SingleAnswerData (id = answer .id , text = answer .text ) for answer in all_answers ]
56+ all_answers = question .single_answers .order_by ("id" )
57+
58+ answers = [
59+ SingleAnswerData (id = answer .id , text = answer .text ) for answer in all_answers
60+ ]
4761
4862 user_result = TaskObjUserResult .objects .get_answered (
49- self .task_object_id , self .profile_id , TypeQuestionPoints .QUESTION_SINGLE_ANSWER
63+ self .task_object_id ,
64+ self .profile_id ,
65+ TypeQuestionPoints .QUESTION_SINGLE_ANSWER ,
5066 )
5167
52- correct_answer = [
53- SingleAnswerData (id = all_answers .get (is_correct = True ).id , text = all_answers .get (is_correct = True ).text )
54- ]
55- random .shuffle (answers )
68+ try :
69+ correct = all_answers .get (is_correct = True )
70+ correct_answer = [SingleAnswerData (id = correct .id , text = correct .text )]
71+ except all_answers .model .DoesNotExist :
72+ correct_answer = []
5673
5774 serializer = self .serializer_class (
5875 QuestionSerializerData (
@@ -61,11 +78,14 @@ def get(self, request, *args, **kwargs) -> Response:
6178 description = question .description ,
6279 files = [file .link for file in question .files .all ()],
6380 answers = correct_answer if user_result else answers ,
64- is_answered = True if user_result else False ,
81+ is_answered = bool ( user_result ) ,
6582 video_url = question .video_url ,
6683 )
6784 )
68- return Response (add_popup_data (serializer .data , self .request_task_object ), status = status .HTTP_200_OK )
85+ return Response (
86+ add_popup_data (serializer .data , self .request_task_object ),
87+ status = status .HTTP_200_OK ,
88+ )
6989
7090
7191class QuestionConnectGet (generics .RetrieveAPIView ):
@@ -117,7 +137,10 @@ def get(self, request, *args, **kwargs):
117137 random .shuffle (target_left )
118138
119139 serializer = self .serializer_class (question_data )
120- return Response (add_popup_data (serializer .data , self .request_task_object ), status = status .HTTP_200_OK )
140+ return Response (
141+ add_popup_data (serializer .data , self .request_task_object ),
142+ status = status .HTTP_200_OK ,
143+ )
121144
122145
123146class QuestionExcludeAnswerGet (generics .RetrieveAPIView ):
@@ -140,9 +163,13 @@ def get(self, request, *args, **kwargs):
140163 question : QuestionSingleAnswer = self .request_question
141164
142165 all_answers = question .single_answers .all ()
143- answers = [SingleAnswerData (id = answer .id , text = answer .text ) for answer in all_answers ]
166+ answers = [
167+ SingleAnswerData (id = answer .id , text = answer .text ) for answer in all_answers
168+ ]
144169 answers_to_exclude = [
145- SingleAnswerData (id = answer .id , text = answer .text ) for answer in all_answers if answer .is_correct
170+ SingleAnswerData (id = answer .id , text = answer .text )
171+ for answer in all_answers
172+ if answer .is_correct
146173 ]
147174
148175 data_to_serialize = QuestionSerializerData (
@@ -162,7 +189,10 @@ def get(self, request, *args, **kwargs):
162189 random .shuffle (answers )
163190
164191 serializer = self .serializer_class (data_to_serialize )
165- return Response (add_popup_data (serializer .data , self .request_task_object ), status = status .HTTP_200_OK )
192+ return Response (
193+ add_popup_data (serializer .data , self .request_task_object ),
194+ status = status .HTTP_200_OK ,
195+ )
166196
167197
168198class InfoSlideDetails (generics .RetrieveAPIView ):
@@ -188,16 +218,23 @@ def get(self, request, *args, **kwargs):
188218 "files" : [file .link for file in info_slide .files .all ()],
189219 "is_done" : bool (
190220 TaskObjUserResult .objects .get_answered (
191- self .task_object_id , self .profile_id , TypeQuestionPoints .INFO_SLIDE
221+ self .task_object_id ,
222+ self .profile_id ,
223+ TypeQuestionPoints .INFO_SLIDE ,
192224 )
193225 ),
194- "video_url" : info_slide .video_url
226+ "video_url" : info_slide .video_url ,
195227 }
196228 )
197229 if serializer .is_valid ():
198- return Response (add_popup_data (serializer .data , self .request_task_object ), status = status .HTTP_200_OK )
230+ return Response (
231+ add_popup_data (serializer .data , self .request_task_object ),
232+ status = status .HTTP_200_OK ,
233+ )
199234 else :
200- return Response ({"error" : serializer .errors }, status = status .HTTP_400_BAD_REQUEST )
235+ return Response (
236+ {"error" : serializer .errors }, status = status .HTTP_400_BAD_REQUEST
237+ )
201238
202239
203240class QuestionWriteAnswer (generics .RetrieveAPIView ):
@@ -221,12 +258,16 @@ def get(self, request, *args, **kwargs):
221258 text = question .text ,
222259 description = question .description ,
223260 files = [file .link for file in question .files .all ()],
224- video_url = question .video_url
261+ video_url = question .video_url ,
225262 )
226263
227264 if user_answer := TaskObjUserResult .objects .get_answered (
228265 self .task_object_id , self .profile_id , TypeQuestionPoints .QUESTION_WRITE
229266 ):
230- write_question .answer = AnswerUserWriteData (id = user_answer .id , text = user_answer .text )
267+ write_question .answer = AnswerUserWriteData (
268+ id = user_answer .id , text = user_answer .text
269+ )
231270 data = asdict (write_question )
232- return Response (add_popup_data (data , self .request_task_object ), status = status .HTTP_200_OK )
271+ return Response (
272+ add_popup_data (data , self .request_task_object ), status = status .HTTP_200_OK
273+ )
0 commit comments