diff --git a/apps/fsm/models/fsm.py b/apps/fsm/models/fsm.py index 00dd1c1..13a506b 100644 --- a/apps/fsm/models/fsm.py +++ b/apps/fsm/models/fsm.py @@ -1,7 +1,7 @@ from django.db import models, transaction from apps.accounts.models import User -from apps.fsm.models.base import Object, ObjectMixin, Paper, clone_paper +from apps.fsm.models.base import Object, ObjectMixin, Paper, Widget, clone_paper from apps.fsm.models.form import AnswerSheet, RegistrationReceipt from apps.fsm.models.program import Program @@ -117,8 +117,21 @@ def clone(self): def get_fsm(fsm_id: int): return FSM.objects.filter(id=fsm_id).first() - def get_widgets(self): - return [] + def get_questions(self): + states = self.states.all() + questions = [] + for state in states: + papers = state.papers.all() + for paper in papers: + questions += paper.widgets.filter( + widget_type__in=[ + Widget.WidgetTypes.SmallAnswerProblem, + Widget.WidgetTypes.BigAnswerProblem, + Widget.WidgetTypes.MultiChoiceProblem, + Widget.WidgetTypes.UploadFileProblem + ] + ) + return questions class Player(models.Model): diff --git a/apps/report/views.py b/apps/report/views.py index bac3a18..40af32c 100644 --- a/apps/report/views.py +++ b/apps/report/views.py @@ -163,16 +163,13 @@ def _get_program_merchandises_purchases_file(form_id): def _get_answer_sheets_excel_file_by_fsm_id(fsm_id): - fsm = FSM.objects.select_related().get(id=fsm_id) + fsm = FSM.objects.get(id=fsm_id) + players = Player.objects.filter(fsm=fsm) + answer_sheets = [] + for player in players: + answer_sheets.append(player.answer_sheet) - # Use select_related to fetch related answer_sheet in a single query - players = Player.objects.select_related('answer_sheet').filter(fsm=fsm) - - # Extract answer_sheets efficiently - answer_sheets = [ - player.answer_sheet for player in players if player.answer_sheet] - - widgets = fsm.get_widgets() + widgets = fsm.get_questions() return _get_answer_sheets_excel_file(widgets, answer_sheets) @@ -218,7 +215,7 @@ def _get_answer_sheets_excel_file(questions, answer_sheets): answer_sheet=answer_sheet) file_answers = UploadFileAnswer.objects.filter( answer_sheet=answer_sheet) - + for answer in small_answers: problem_column = f'Problem {answer.problem.id}' answer_sheet_data[problem_column] = answer.text