Fixed listening import
This commit is contained in:
@@ -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"
|
||||
)
|
||||
Reference in New Issue
Block a user