Plugin: Remedial Course: Move code to plugin class - refs BT#18165

pull/3860/head
Angel Fernando Quiroz Campos 5 years ago
parent 65999821c4
commit 3a1c351d11
  1. 159
      main/exercise/exercise.class.php
  2. 9
      main/exercise/exercise_report.php
  3. 6
      main/exercise/exercise_result.php
  4. 8
      main/exercise/overview.php
  5. 153
      plugin/remedial_course/RemedialCoursePlugin.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).
*

@ -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)

@ -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(

@ -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);
}

@ -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;
}
}

Loading…
Cancel
Save