Exercise: refactor exercise notifications BT#17787

pull/3622/head
Julio Montoya 5 years ago
parent 87bdefa8e0
commit 017ad907f4
  1. 5
      main/exercise/exercise.class.php
  2. 37
      main/exercise/exercise_report.php
  3. 190
      main/exercise/exercise_result.php
  4. 57
      main/inc/lib/events.lib.php
  5. 189
      main/inc/lib/exercise.lib.php

@ -4425,8 +4425,11 @@ class Exercise
question_id= ".$questionId;
$result = Database::query($sql);
$data = Database::fetch_array($result);
$choice = '';
if ($data) {
$choice = $data['answer'];
}
$choice = $data['answer'];
$choice = str_replace('\r\n', '', $choice);
$choice = stripslashes($choice);
$questionScore = $data['marks'];

@ -240,8 +240,10 @@ if (isset($_REQUEST['comments']) &&
$tot = $pluginEvaluation->getResultWithFormula($id, $formula);
}
$totalScore = (float) $tot;
$sql = "UPDATE $TBL_TRACK_EXERCISES
SET exe_result = '".floatval($tot)."'
SET exe_result = '".$totalScore."'
WHERE exe_id = ".$id;
Database::query($sql);
@ -264,6 +266,39 @@ if (isset($_REQUEST['comments']) &&
}
}
$notifications = api_get_configuration_value('exercise_finished_notification_settings');
if ($notifications) {
ob_start();
$stats = ExerciseLib::displayQuestionListByAttempt(
$objExerciseTmp,
$track_exercise_info['exe_id'],
false,
false,
false,
api_get_configuration_value('quiz_results_answers_report'),
false
);
ob_end_clean();
$attemptCount = Event::getAttemptPosition(
$track_exercise_info['exe_id'],
$student_id,
$objExerciseTmp->id,
$lp_id,
$lpItemId,
$lp_item_view_id
);
ExerciseLib::sendNotification(
$student_id,
$objExerciseTmp,
$track_exercise_info,
api_get_course_info(),
$attemptCount,
$stats
);
}
// Updating LP score here
if (!empty($lp_id) && !empty($lpItemId)) {
$statusCondition = '';

@ -227,188 +227,14 @@ if (!empty($learnpath_id) && $saveResults) {
Exercise::saveExerciseInLp($learnpath_item_id, $exeId);
}
$notifications = api_get_configuration_value('exercise_finished_notification_settings');
if (!empty($notifications)) {
$exerciseExtraFieldValue = new ExtraFieldValue('exercise');
$attemptCountToSend = $attempt_count++;
$wrongAnswersCount = $stats['failed_answers_count'];
$exercisePassed = $stats['exercise_passed'];
$countPendingQuestions = $stats['count_pending_questions'];
// If there are no pending questions (Open questions).
if (0 === $countPendingQuestions) {
$totalScore = ExerciseLib::show_score($total_score, $max_score, false, true);
$subject = sprintf(get_lang('WrongAttemptXInCourseX'), $attemptCountToSend, $courseInfo['title']);
if ($exercisePassed) {
$subject = sprintf(get_lang('ExerciseValidationInCourseX'), $courseInfo['title']);
}
if ($exercisePassed) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'MailSuccess'
);
} else {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'MailAttempt'.$attemptCountToSend
);
}
$content = '';
if ($extraFieldData && isset($extraFieldData['value'])) {
$content = $extraFieldData['value'];
$content = ExerciseLib::parseContent($content, $stats, $objExercise, $exercise_stat_info);
if (false === $exercisePassed) {
if (0 !== $wrongAnswersCount) {
$content .= $stats['failed_answers_html'];
}
}
// Send to student
MessageManager::send_message($currentUserId, $subject, $content);
}
// Subject for notifications
/*$subject = sprintf(get_lang('WrongAttemptXInCourseX'), $attemptCountToSend, $courseInfo['title']);
if ($exercisePassed) {
$subject = sprintf(get_lang('ExerciseValidationInCourseX'), $courseInfo['title']);
}*/
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'notifications'
);
$exerciseNotification = '';
if ($extraFieldData && isset($extraFieldData['value'])) {
$exerciseNotification = $extraFieldData['value'];
}
if (!empty($exerciseNotification) && !empty($notifications)) {
foreach ($notifications as $name => $notificationList) {
if ($exerciseNotification !== $name) {
continue;
}
foreach ($notificationList as $attemptData) {
$email = isset($attemptData['email']) ? $attemptData['email'] : '';
$emailList = explode(',', $email);
if (empty($emailList)) {
continue;
}
$attempts = $attemptData['attempts'];
foreach ($attempts as $attempt) {
$sendMessage = false;
if (isset($attempt['attempt']) && $attemptCountToSend !== (int) $attempt['attempt']) {
continue;
}
if (!isset($attempt['status'])) {
continue;
}
switch ($attempt['status']) {
case 'passed':
if ($exercisePassed) {
$sendMessage = true;
}
break;
case 'failed':
if (false === $exercisePassed) {
$sendMessage = true;
}
break;
case 'all':
$sendMessage = true;
break;
}
if ($sendMessage) {
$attachments = [];
if (isset($attempt['add_pdf']) && $attempt['add_pdf']) {
// Get pdf content
$pdfExtraData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$attempt['add_pdf']
);
if ($pdfExtraData && isset($pdfExtraData['value'])) {
$pdfContent = ExerciseLib::parseContent(
$pdfExtraData['value'],
$stats,
$objExercise,
$exercise_stat_info
);
@$pdf = new PDF();
$filename = get_lang('Exercise');
$cssFile = api_get_path(SYS_CSS_PATH).'themes/chamilo/default.css';
$pdfPath = @$pdf->content_to_pdf(
"<html><body>$pdfContent</body></html>",
file_get_contents($cssFile),
$filename,
api_get_course_id(),
'F',
false,
null,
false,
true
);
$attachments[] = ['filename' => $filename, 'path' => $pdfPath];
}
}
$content = isset($attempt['content_default']) ? $attempt['content_default'] : '';
if (isset($attempt['content'])) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$attempt['content']
);
if ($extraFieldData && isset($extraFieldData['value']) && !empty($extraFieldData['value'])) {
$content = $extraFieldData['value'];
}
}
if (!empty($content)) {
$content = ExerciseLib::parseContent(
$content,
$stats,
$objExercise,
$exercise_stat_info
);
foreach ($emailList as $email) {
if (empty($email)) {
continue;
}
api_mail_html(
null,
$email,
$subject,
$content,
null,
null,
[],
$attachments
);
}
}
if (isset($attempt['post_actions'])) {
foreach ($attempt['post_actions'] as $action => $params) {
switch ($action) {
case 'subscribe_student_to_courses':
foreach ($params as $code) {
CourseManager::subscribeUser($currentUserId, $code);
break;
}
break;
}
}
}
}
}
}
}
}
}
}
ExerciseLib::sendNotification(
api_get_user_id(),
$objExercise,
$exercise_stat_info,
$courseInfo,
$attempt_count++,
$stats
);
$hookQuizEnd = HookQuizEnd::create();
$hookQuizEnd->setEventData(['exe_id' => $exeId]);

@ -1099,7 +1099,7 @@ class Event
$lp_item_id,
$lp_item_view_id
) {
$stat_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$user_id = (int) $user_id;
$exerciseId = (int) $exerciseId;
$lp_id = (int) $lp_id;
@ -1109,7 +1109,7 @@ class Event
$sessionId = api_get_session_id();
$sql = "SELECT count(*) as count
FROM $stat_table
FROM $table
WHERE
exe_exo_id = $exerciseId AND
exe_user_id = $user_id AND
@ -1120,9 +1120,9 @@ class Event
c_id = $courseId AND
session_id = $sessionId";
$query = Database::query($sql);
if (Database::num_rows($query) > 0) {
$attempt = Database::fetch_array($query, 'ASSOC');
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
$attempt = Database::fetch_array($result, 'ASSOC');
return (int) $attempt['count'];
}
@ -1130,6 +1130,53 @@ class Event
return 0;
}
public static function getAttemptPosition(
$exeId,
$user_id,
$exerciseId,
$lp_id,
$lp_item_id,
$lp_item_view_id
) {
$table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$user_id = (int) $user_id;
$exerciseId = (int) $exerciseId;
$lp_id = (int) $lp_id;
$lp_item_id = (int) $lp_item_id;
$lp_item_view_id = (int) $lp_item_view_id;
$courseId = api_get_course_int_id();
$sessionId = api_get_session_id();
$sql = "SELECT exe_id
FROM $table
WHERE
exe_exo_id = $exerciseId AND
exe_user_id = $user_id AND
status = '' AND
orig_lp_id = $lp_id AND
orig_lp_item_id = $lp_item_id AND
orig_lp_item_view_id = $lp_item_view_id AND
c_id = $courseId AND
session_id = $sessionId
ORDER by exe_id
";
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
$position = 1;
while ($row = Database::fetch_array($result, 'ASSOC')) {
if ($row['exe_id'] === $exeId) {
break;
}
$position++;
}
return $position;
}
return 0;
}
/**
* @param $user_id
* @param $exerciseId

@ -5870,4 +5870,193 @@ EOT;
return $content;
}
public static function sendNotification($currentUserId, $objExercise, $exercise_stat_info, $courseInfo, $attemptCountToSend, $stats)
{
$notifications = api_get_configuration_value('exercise_finished_notification_settings');
if (empty($notifications)) {
return false;
}
$exerciseExtraFieldValue = new ExtraFieldValue('exercise');
//$attemptCountToSend = $attempt_count++;
$wrongAnswersCount = $stats['failed_answers_count'];
$exercisePassed = $stats['exercise_passed'];
$countPendingQuestions = $stats['count_pending_questions'];
// If there are no pending questions (Open questions).
if (0 === $countPendingQuestions) {
//$totalScore = self::show_score($total_score, $max_score, false, true);
$subject = sprintf(get_lang('WrongAttemptXInCourseX'), $attemptCountToSend, $courseInfo['title']);
if ($exercisePassed) {
$subject = sprintf(get_lang('ExerciseValidationInCourseX'), $courseInfo['title']);
}
if ($exercisePassed) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'MailSuccess'
);
} else {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'MailAttempt'.$attemptCountToSend
);
}
if ($extraFieldData && isset($extraFieldData['value'])) {
$content = $extraFieldData['value'];
$content = self::parseContent($content, $stats, $objExercise, $exercise_stat_info);
if (false === $exercisePassed) {
if (0 !== $wrongAnswersCount) {
$content .= $stats['failed_answers_html'];
}
}
// Send to student
MessageManager::send_message($currentUserId, $subject, $content);
}
// Subject for notifications
/*$subject = sprintf(get_lang('WrongAttemptXInCourseX'), $attemptCountToSend, $courseInfo['title']);
if ($exercisePassed) {
$subject = sprintf(get_lang('ExerciseValidationInCourseX'), $courseInfo['title']);
}*/
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
'notifications'
);
$exerciseNotification = '';
if ($extraFieldData && isset($extraFieldData['value'])) {
$exerciseNotification = $extraFieldData['value'];
}
if (!empty($exerciseNotification) && !empty($notifications)) {
foreach ($notifications as $name => $notificationList) {
if ($exerciseNotification !== $name) {
continue;
}
foreach ($notificationList as $attemptData) {
$email = isset($attemptData['email']) ? $attemptData['email'] : '';
$emailList = explode(',', $email);
if (empty($emailList)) {
continue;
}
$attempts = $attemptData['attempts'];
foreach ($attempts as $attempt) {
$sendMessage = false;
if (isset($attempt['attempt']) && $attemptCountToSend !== (int) $attempt['attempt']) {
continue;
}
if (!isset($attempt['status'])) {
continue;
}
switch ($attempt['status']) {
case 'passed':
if ($exercisePassed) {
$sendMessage = true;
}
break;
case 'failed':
if (false === $exercisePassed) {
$sendMessage = true;
}
break;
case 'all':
$sendMessage = true;
break;
}
if ($sendMessage) {
$attachments = [];
if (isset($attempt['add_pdf']) && $attempt['add_pdf']) {
// Get pdf content
$pdfExtraData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$attempt['add_pdf']
);
if ($pdfExtraData && isset($pdfExtraData['value'])) {
$pdfContent = self::parseContent(
$pdfExtraData['value'],
$stats,
$objExercise,
$exercise_stat_info
);
@$pdf = new PDF();
$filename = get_lang('Exercise');
$cssFile = api_get_path(SYS_CSS_PATH).'themes/chamilo/default.css';
$pdfPath = @$pdf->content_to_pdf(
"<html><body>$pdfContent</body></html>",
file_get_contents($cssFile),
$filename,
api_get_course_id(),
'F',
false,
null,
false,
true
);
$attachments[] = ['filename' => $filename, 'path' => $pdfPath];
}
}
$content = isset($attempt['content_default']) ? $attempt['content_default'] : '';
if (isset($attempt['content'])) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$attempt['content']
);
if ($extraFieldData && isset($extraFieldData['value']) && !empty($extraFieldData['value'])) {
$content = $extraFieldData['value'];
}
}
if (!empty($content)) {
$content = self::parseContent(
$content,
$stats,
$objExercise,
$exercise_stat_info
);
foreach ($emailList as $email) {
if (empty($email)) {
continue;
}
api_mail_html(
null,
$email,
$subject,
$content,
null,
null,
[],
$attachments
);
}
}
if (isset($attempt['post_actions'])) {
foreach ($attempt['post_actions'] as $action => $params) {
switch ($action) {
case 'subscribe_student_to_courses':
foreach ($params as $code) {
CourseManager::subscribeUser($currentUserId, $code);
break;
}
break;
}
}
}
}
}
}
}
}
}
}
}

Loading…
Cancel
Save