import logging from typing import Dict, List from app.configs.constants import FilePaths from app.controllers.abc import IGradeController from app.dtos.writing import WritingGradeTaskDTO from app.helpers import FileHelper from app.services.abc import ISpeakingService, IWritingService, IGradeService from app.utils import handle_exception class GradeController(IGradeController): def __init__( self, grade_service: IGradeService, speaking_service: ISpeakingService, writing_service: IWritingService ): self._service = grade_service self._speaking_service = speaking_service self._writing_service = writing_service self._logger = logging.getLogger(__name__) async def grade_writing_task(self, task: int, data: WritingGradeTaskDTO): return await self._writing_service.grade_writing_task(task, data.question, data.answer) @handle_exception(400) async def grade_speaking_task(self, task: int, answers: List[Dict]) -> Dict: FileHelper.delete_files_older_than_one_day(FilePaths.AUDIO_FILES_PATH) return await self._speaking_service.grade_speaking_task(task, answers) async def grade_short_answers(self, data: Dict): return await self._service.grade_short_answers(data) async def grading_summary(self, data: Dict): section_keys = ['reading', 'listening', 'writing', 'speaking', 'level'] extracted_sections = self._extract_existing_sections_from_body(data, section_keys) return await self._service.calculate_grading_summary(extracted_sections) @staticmethod def _extract_existing_sections_from_body(my_dict, keys_to_extract): if 'sections' in my_dict and isinstance(my_dict['sections'], list) and len(my_dict['sections']) > 0: return list( filter( lambda item: 'code' in item and item['code'] in keys_to_extract and 'grade' in item and 'name' in item, my_dict['sections'] ) )