55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
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']
|
|
)
|
|
)
|
|
|