Fixed listening import

This commit is contained in:
Carlos-Mesquita
2024-11-15 02:47:37 +00:00
parent e99eda485e
commit 18103c931e
4 changed files with 148 additions and 56 deletions

View File

@@ -1,14 +1,75 @@
from typing import Dict, Any
from typing import Dict, Any, List, Union, Optional
from app.dtos.exams.listening import TrueFalseExercise, MultipleChoiceExercise, WriteBlanksExercise, ListeningExam, \
ListeningSection
from pydantic import BaseModel
from app.dtos.exams.listening import (
TrueFalseExercise,
MultipleChoiceExercise,
WriteBlanksExercise,
ListeningExam,
ListeningSection,
WriteBlanksVariant, WriteBlankSolution, WriteBlanksQuestionExercise, WriteBlankQuestion
)
class ListeningQuestionSection(BaseModel):
exercises: List[Union[TrueFalseExercise, MultipleChoiceExercise, WriteBlanksQuestionExercise]]
class ListeningQuestionExam(BaseModel):
parts: List[ListeningQuestionSection]
minTimer: Optional[int]
module: str = "listening"
class WriteBlankProcessor:
@staticmethod
def to_question_model(exercise_data: Dict[str, Any]) -> WriteBlanksQuestionExercise:
questions = [
WriteBlankQuestion(
id=q["id"],
prompt=q["prompt"],
solution=q["solution"]
)
for q in exercise_data.get("questions", [])
]
return WriteBlanksQuestionExercise(
type="writeBlanks",
prompt=exercise_data.get("prompt"),
maxWords=exercise_data.get("maxWords"),
questions=questions,
variant=exercise_data.get("variant", "questions")
)
@staticmethod
def to_text_model(question_model: WriteBlanksQuestionExercise) -> WriteBlanksExercise:
if question_model.variant == WriteBlanksVariant.QUESTIONS:
text = '\\n'.join(f"{q.prompt} {{{{{q.id}}}}}" for q in question_model.questions)
elif question_model.variant == WriteBlanksVariant.FILL:
text = ' '.join(f"{q.prompt}" for q in question_model.questions)
elif question_model.variant == WriteBlanksVariant.FORM:
text = '\\n'.join(f"{q.prompt}" for q in question_model.questions)
else:
raise ValueError(f"Unknown variant: {question_model.variant}")
solutions = [
WriteBlankSolution(id=q.id, solution=q.solution)
for q in question_model.questions
]
return WriteBlanksExercise(
type="writeBlanks",
prompt=question_model.prompt,
maxWords=question_model.maxWords,
text=text,
solutions=solutions,
variant=question_model.variant
)
class ListeningMapper:
@staticmethod
def map_to_test_model(response: Dict[str, Any]) -> ListeningExam:
sections = []
for section in response.get('sections', []):
question_parts = []
for section in response.get('parts', []):
section_exercises = []
for exercise in section['exercises']:
@@ -19,14 +80,33 @@ class ListeningMapper:
elif exercise_type == 'multipleChoice':
section_exercises.append(MultipleChoiceExercise(**exercise))
elif exercise_type == 'writeBlanks':
section_exercises.append(WriteBlanksExercise(**exercise))
question_model = WriteBlankProcessor.to_question_model(exercise)
section_exercises.append(question_model)
else:
raise ValueError(f"Unknown exercise type: {exercise_type}")
sections.append(ListeningSection(exercises=section_exercises))
question_parts.append(ListeningQuestionSection(exercises=section_exercises))
return ListeningExam(
sections=sections,
question_exam = ListeningQuestionExam(
parts=question_parts,
minTimer=response.get('minTimer'),
module="listening"
)
final_parts = []
for section in question_exam.parts:
final_exercises = []
for exercise in section.exercises:
if isinstance(exercise, WriteBlanksQuestionExercise):
final_exercises.append(WriteBlankProcessor.to_text_model(exercise))
else:
final_exercises.append(exercise)
final_parts.append(ListeningSection(exercises=final_exercises))
return ListeningExam(
parts=final_parts,
minTimer=response.get('minTimer'),
module="listening"
)