From 3a1c351d11438b727ebbab8f3eaa94fb2bda2dab Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Thu, 29 Apr 2021 11:17:38 -0500 Subject: [PATCH] Plugin: Remedial Course: Move code to plugin class - refs BT#18165 --- main/exercise/exercise.class.php | 159 +----------------- main/exercise/exercise_report.php | 9 +- main/exercise/exercise_result.php | 6 +- main/exercise/overview.php | 8 +- .../remedial_course/RemedialCoursePlugin.php | 153 ++++++++++++++++- 5 files changed, 178 insertions(+), 157 deletions(-) diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index 6ac6396ae3..130246fa79 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -6814,6 +6814,8 @@ class Exercise } } + $remedialCoursePlugin = RemedialCoursePlugin::create(); + // BT#18165 $exerciseAttempts = $this->selectAttempts(); if ($exerciseAttempts > 0) { @@ -6827,7 +6829,7 @@ class Exercise ); $message .= $this->advancedCourseList($userId, api_get_session_id()); if ($attemptCount >= $exerciseAttempts) { - $message .= $this->remedialCourseList($userId, api_get_session_id()); + $message .= $remedialCoursePlugin->getRemedialCourseList($this, $userId, api_get_session_id()); } } // 4. We check if the student have attempts @@ -6876,7 +6878,11 @@ class Exercise $blockPercentage ); $isVisible = false; // See BT#18165 - $message .= $this->remedialCourseList(api_get_user_id(), api_get_session_id()); + $message .= $remedialCoursePlugin->getRemedialCourseList( + $this, + api_get_user_id(), + api_get_session_id() + ); } } } @@ -11007,155 +11013,6 @@ class Exercise return false; } - /** - * When a student completes the number of attempts and fails the exam, she is enrolled in a series of remedial - * courses BT#18165. - * - * @param int $userId - * @param int $sessionId - * @param bool $review - * - * @return string|null - */ - public function remedialCourseList($userId = 0, $sessionId = 0, $review = false) - { - $userId = empty($userId) ? api_get_user_id() : (int) $userId; - $sessionId = (int) $sessionId; - $pluginRemedial = api_get_plugin_setting('remedial_course', 'enabled') === 'true'; - if (!$pluginRemedial) { - return null; - } - $field = new ExtraField('exercise'); - $remedialField = $field->get_handler_field_info_by_field_variable('remedialcourselist'); - - if (empty($remedialField)) { - return null; - } - - $extraFieldValue = new ExtraFieldValue('exercise'); - $remedialExcerciseField = $extraFieldValue->get_values_by_handler_and_field_variable( - $this->iId, - 'remedialcourselist' - ); - $remedialCourseIds = explode(';', $remedialExcerciseField['value']); - - if (empty($remedialExcerciseField['value']) || count($remedialCourseIds) == 0) { - return null; - } - - $questionExcluded = [ - FREE_ANSWER, - ORAL_EXPRESSION, - ANNOTATION, - ]; - - $exercise_stat_info = Event::getExerciseResultsByUser( - $userId, - $this->id, - $this->course_id, - $sessionId - ); - $bestAttempt = Event::get_best_attempt_exercise_results_per_user( - $userId, - $this->id, - $this->course_id, - $sessionId - ); - foreach ($exercise_stat_info as $attempt) { - if (!isset($bestAttempt['exe_result']) || $attempt['exe_result'] >= $bestAttempt['exe_result']) { - $bestAttempt = $attempt; - } - if (isset($attempt['question_list'])) { - foreach ($attempt['question_list'] as $questionId => $answer) { - $question = Question::read($questionId, api_get_course_info_by_id($attempt['c_id'])); - $questionOpen = 0; - $totalQuestionExcluded = count($questionExcluded); - for ($i = 0; $i < $totalQuestionExcluded; $i++) { - if ($question->type == (int) $questionExcluded[$i]) { - $questionOpen = 1; - break; - } - } - if ($review == true) { - $questionOpen = 0; - } - if (1 == $questionOpen) { - $score = $attempt['exe_result']; - $comments = Event::get_comments($this->id, $questionId); - if (empty($comments) || $score == 0) { - return null; - } - } - } - } - } - if (count($bestAttempt) == 0) { - return null; - } - $canRemedial = false; - if (isset($bestAttempt['exe_result'])) { - $bestAttempt['exe_result'] = (int) $bestAttempt['exe_result']; - $canRemedial = $this->isBlockedByPercentage($bestAttempt); - if (false == $canRemedial) { - $pass = ExerciseLib::isPassPercentageAttemptPassed( - $this, - $bestAttempt['exe_result'], - $bestAttempt['exe_weighting'] - ); - $canRemedial = false === $pass; - if (false == $canRemedial) { - return null; - } - } - } - - // Remedial course - if (!$canRemedial) { - return null; - } - - $courses = []; - $isInASession = !empty($sessionId); - foreach ($remedialCourseIds as $course) { - $courseData = api_get_course_info_by_id($course); - if (!empty($courseData) && isset($courseData['real_id'])) { - if ($isInASession) { - $courseExistsInSession = SessionManager::sessionHasCourse($sessionId, $courseData['code']); - if ($courseExistsInSession) { - SessionManager::subscribe_users_to_session_course( - [$userId], - $sessionId, - $courseData['code'] - ); - $courses[] = $courseData['title']; - } - } else { - $isSubscribed = CourseManager::is_user_subscribed_in_course( - $userId, - $courseData['code'] - ); - if (!$isSubscribed) { - CourseManager::subscribeUser( - $userId, - $courseData['code'], - STUDENT - ); - $courses[] = $courseData['title']; - } - } - } - } - - if (0 != count($courses)) { - return sprintf( - get_plugin_lang('SubscriptionToXRemedialCourses', RemedialCoursePlugin::class), - implode(' - ', $courses) - ); - } - - return null; - } - /** * Gets the question list ordered by the question_order setting (drag and drop). * diff --git a/main/exercise/exercise_report.php b/main/exercise/exercise_report.php index 1acde92e37..5257b27d0a 100755 --- a/main/exercise/exercise_report.php +++ b/main/exercise/exercise_report.php @@ -160,7 +160,7 @@ if (isset($_REQUEST['comments']) && if (empty($track_exercise_info)) { api_not_allowed(); } - $student_id = $track_exercise_info['exe_user_id']; + $student_id = (int) $track_exercise_info['exe_user_id']; $session_id = $track_exercise_info['session_id']; $lp_id = $track_exercise_info['orig_lp_id']; $lpItemId = $track_exercise_info['orig_lp_item_id']; @@ -266,7 +266,12 @@ if (isset($_REQUEST['comments']) && Database::query($sql); // See BT#18165 - $remedialMessage = $objExerciseTmp->remedialCourseList($student_id, api_get_session_id(), true); + $remedialMessage = RemedialCoursePlugin::create()->getRemedialCourseList( + $objExerciseTmp, + $student_id, + api_get_session_id(), + true + ); if (null != $remedialMessage) { Display::addFlash( Display::return_message($remedialMessage, 'warning', false) diff --git a/main/exercise/exercise_result.php b/main/exercise/exercise_result.php index 3c27f235e7..c2454e8edd 100755 --- a/main/exercise/exercise_result.php +++ b/main/exercise/exercise_result.php @@ -278,7 +278,11 @@ if (null != $advanceCourseMessage) { ); } -$remedialMessage = $objExercise->remedialCourseList(api_get_user_id(), api_get_session_id()); +$remedialMessage = RemedialCoursePlugin::create()->getRemedialCourseList( + $objExercise, + api_get_user_id(), + api_get_session_id() +); if (null != $remedialMessage) { Display::addFlash( diff --git a/main/exercise/overview.php b/main/exercise/overview.php index 8347d87d8b..4dbba29863 100755 --- a/main/exercise/overview.php +++ b/main/exercise/overview.php @@ -205,7 +205,13 @@ if (!empty($advanceMessage)) { false ); } -$remedialMessage = $objExercise->remedialCourseList(api_get_user_id(), api_get_session_id()); + +$remedialMessage = RemedialCoursePlugin::create()->getRemedialCourseList( + $objExercise, + api_get_user_id(), + api_get_session_id() +); + if (null != $remedialMessage) { $message .= Display::return_message($remedialMessage, 'warning', false); } diff --git a/plugin/remedial_course/RemedialCoursePlugin.php b/plugin/remedial_course/RemedialCoursePlugin.php index b6a1e26cb5..fac4954191 100644 --- a/plugin/remedial_course/RemedialCoursePlugin.php +++ b/plugin/remedial_course/RemedialCoursePlugin.php @@ -8,6 +8,7 @@ class RemedialCoursePlugin extends Plugin { const SETTING_ENABLED = 'enabled'; + const EXTRAFIELD_REMEDIAL_VARIABLE = 'remedialcourselist'; /** * RemedialCoursePlugin constructor. @@ -50,11 +51,11 @@ class RemedialCoursePlugin extends Plugin public function saveRemedialField() { $extraField = new ExtraField('exercise'); - $remedialcourselist = $extraField->get_handler_field_info_by_field_variable('remedialcourselist'); + $remedialcourselist = $extraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_REMEDIAL_VARIABLE); if (false === $remedialcourselist) { $extraField->save([ 'field_type' => ExtraField::FIELD_TYPE_SELECT_MULTIPLE, - 'variable' => 'remedialcourselist', + 'variable' => self::EXTRAFIELD_REMEDIAL_VARIABLE, 'display_text' => 'remedialCourseList', 'default_value' => 1, 'field_order' => 0, @@ -100,4 +101,152 @@ class RemedialCoursePlugin extends Plugin { return 'remedial_course'; } + + public function getRemedialCourseList( + Exercise $objExercise, + int $userId = 0, + int $sessionId = 0, + bool $review = false + ): ?string { + if ('true' !== $this->get(self::SETTING_ENABLED)) { + return null; + } + + $field = new ExtraField('exercise'); + $remedialField = $field->get_handler_field_info_by_field_variable(self::EXTRAFIELD_REMEDIAL_VARIABLE); + + if (empty($remedialField)) { + return null; + } + + $extraFieldValue = new ExtraFieldValue('exercise'); + $remedialExcerciseField = $extraFieldValue->get_values_by_handler_and_field_variable( + $objExercise->iId, + self::EXTRAFIELD_REMEDIAL_VARIABLE + ); + $remedialCourseIds = explode(';', $remedialExcerciseField['value']); + + if (empty($remedialExcerciseField['value']) || count($remedialCourseIds) == 0) { + return null; + } + + $questionExcluded = [ + FREE_ANSWER, + ORAL_EXPRESSION, + ANNOTATION, + ]; + + $userId = empty($userId) ? api_get_user_id() : (int) $userId; + $sessionId = (int) $sessionId; + + $exerciseStatInfo = Event::getExerciseResultsByUser( + $userId, + $objExercise->iId, + $objExercise->course_id, + $sessionId + ); + $bestAttempt = Event::get_best_attempt_exercise_results_per_user( + $userId, + $objExercise->iId, + $objExercise->course_id, + $sessionId + ); + + foreach ($exerciseStatInfo as $attempt) { + if (!isset($bestAttempt['exe_result']) || $attempt['exe_result'] >= $bestAttempt['exe_result']) { + $bestAttempt = $attempt; + } + + if (isset($attempt['question_list'])) { + foreach ($attempt['question_list'] as $questionId => $answer) { + $question = Question::read($questionId, api_get_course_info_by_id($attempt['c_id'])); + $questionOpen = 0; + $totalQuestionExcluded = count($questionExcluded); + + for ($i = 0; $i < $totalQuestionExcluded; $i++) { + if ($question->type == (int) $questionExcluded[$i]) { + $questionOpen = 1; + break; + } + } + + if ($review == true) { + $questionOpen = 0; + } + + if (1 == $questionOpen) { + $score = $attempt['exe_result']; + $comments = Event::get_comments($objExercise->iId, $questionId); + + if (empty($comments) || $score == 0) { + return null; + } + } + } + } + } + + if (count($bestAttempt) == 0) { + return null; + } + + $canRemedial = false; + + if (isset($bestAttempt['exe_result'])) { + $bestAttempt['exe_result'] = (int) $bestAttempt['exe_result']; + $canRemedial = $objExercise->isBlockedByPercentage($bestAttempt); + + if (false == $canRemedial) { + $pass = ExerciseLib::isPassPercentageAttemptPassed( + $objExercise, + $bestAttempt['exe_result'], + $bestAttempt['exe_weighting'] + ); + $canRemedial = false === $pass; + + if (false == $canRemedial) { + return null; + } + } + } + + // Remedial course + if (!$canRemedial) { + return null; + } + + $courses = []; + $isInASession = !empty($sessionId); + + foreach ($remedialCourseIds as $course) { + $courseData = api_get_course_info_by_id($course); + + if (!empty($courseData) && isset($courseData['real_id'])) { + if ($isInASession) { + $courseExistsInSession = SessionManager::sessionHasCourse($sessionId, $courseData['code']); + + if ($courseExistsInSession) { + SessionManager::subscribe_users_to_session_course([$userId], $sessionId, $courseData['code']); + $courses[] = $courseData['title']; + } + } else { + $isSubscribed = CourseManager::is_user_subscribed_in_course($userId, $courseData['code']); + + if (!$isSubscribed) { + CourseManager::subscribeUser($userId, $courseData['code']); + $courses[] = $courseData['title']; + } + } + } + } + + if (0 != count($courses)) { + return sprintf( + $this->get_lang('SubscriptionToXRemedialCourses'), + implode(' - ', $courses) + ); + } + + return null; + } }