Skip to content

Commit

Permalink
Admin: Add config add_exercise_best_attempt_in_report BT#18096
Browse files Browse the repository at this point in the history
Shows the exercise best result in the course report
  • Loading branch information
jmontoyaa committed Nov 26, 2020
1 parent 1353b88 commit defa11b
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 15 deletions.
28 changes: 18 additions & 10 deletions main/inc/lib/events.lib.php
Expand Up @@ -1775,18 +1775,20 @@ public static function get_best_exercise_results_by_user(
/**
* Get the last best result from all attempts in exercises per user (out of learning paths).
*
* @param int $user_id
* @param int $exercise_id
* @param int $courseId
* @param int $session_id
* @param int $user_id
* @param int $exercise_id
* @param int $courseId
* @param int $session_id
* @param bool $skipLpResults
*
* @return array
*/
public static function get_best_attempt_exercise_results_per_user(
$user_id,
$exercise_id,
$courseId,
$session_id = 0
$session_id = 0,
$skipLpResults = true
) {
$table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$courseId = (int) $courseId;
Expand All @@ -1800,17 +1802,23 @@ public static function get_best_attempt_exercise_results_per_user(
c_id = $courseId AND
exe_exo_id = $exercise_id AND
session_id = $session_id AND
exe_user_id = $user_id AND
orig_lp_id = 0 AND
orig_lp_item_id = 0
ORDER BY exe_id";
exe_user_id = $user_id
";

if ($skipLpResults) {
$sql .= ' AND
orig_lp_id = 0 AND
orig_lp_item_id = 0 ';
}

$sql .= ' ORDER BY exe_id ';

$res = Database::query($sql);
$list = [];
while ($row = Database::fetch_array($res, 'ASSOC')) {
$list[$row['exe_id']] = $row;
}
//Getting the best results of every student
// Getting the best results of every student.
$best_score_return = [];
$best_score_return['exe_result'] = 0;

Expand Down
44 changes: 43 additions & 1 deletion main/inc/lib/tracking.lib.php
Expand Up @@ -7566,7 +7566,7 @@ public static function getAdditionalProfileInformationOfFieldByUser($field_id, $
}

if ($result_extra_field['field_type'] == ExtraField::FIELD_TYPE_TRIPLE_SELECT) {
list($level1, $level2, $level3) = explode(';', $row['value']);
[$level1, $level2, $level3] = explode(';', $row['value']);

$row['value'] = $result_extra_field['options'][$level1]['display_text'].' / ';
$row['value'] .= $result_extra_field['options'][$level2]['display_text'].' / ';
Expand Down Expand Up @@ -7786,6 +7786,21 @@ public static function get_user_data(
$sortByFirstName = api_sort_by_first_name();
Session::write('user_id_list', []);
$userIdList = [];

$addExerciseOption = api_get_configuration_value('add_exercise_best_attempt_in_report');
$exerciseResultsToCheck = [];
if (!empty($addExerciseOption) && isset($addExerciseOption['courses']) &&
isset($addExerciseOption['courses'][$courseCode])
) {
foreach ($addExerciseOption['courses'][$courseCode] as $exerciseId) {
$exercise = new Exercise();
$exercise->read($exerciseId);
if ($exercise->iId) {
$exerciseResultsToCheck[] = $exercise;
}
}
}

while ($user = Database::fetch_array($res, 'ASSOC')) {
$userIdList[] = $user['user_id'];
$user['official_code'] = $user['col0'];
Expand Down Expand Up @@ -7857,6 +7872,27 @@ public static function get_user_data(
$user['student_score_best'] = $averageBestScore;
}

$exerciseResults = [];
if (!empty($exerciseResultsToCheck)) {
foreach ($exerciseResultsToCheck as $exercise) {
$bestExerciseResult = Event::get_best_attempt_exercise_results_per_user(
$user['user_id'],
$exercise->iId,
$courseId,
$session_id,
true
);

$best = null;
if ($bestExerciseResult) {
$best = $bestExerciseResult['exe_result'] / $bestExerciseResult['exe_weighting'];
$best = round($best, 2) * 100;
$best .= '%';
}
$exerciseResults['exercise_'.$exercise->iId] = $best;
}
}

$user['count_assignments'] = Tracking::count_student_assignments(
$user['user_id'],
$course_code,
Expand Down Expand Up @@ -7921,6 +7957,12 @@ public static function get_user_data(
$user_row['exercise_average_best_attempt'] = $user['exercise_average_best_attempt'];
$user_row['student_score'] = $user['student_score'];
$user_row['student_score_best'] = $user['student_score_best'];
if (!empty($exerciseResults)) {
foreach ($exerciseResults as $exerciseId => $bestResult) {
$user_row[$exerciseId] = $bestResult;
}
}

$user_row['count_assignments'] = $user['count_assignments'];
$user_row['count_messages'] = $user['count_messages'];

Expand Down
7 changes: 7 additions & 0 deletions main/install/configuration.dist.php
Expand Up @@ -1773,6 +1773,13 @@
// All courses with category MY_CATEGORY will be used as course templates BT#18083
// $_configuration['course_category_code_to_use_as_model'] = 'MY_CATEGORY';

// Shows the best exercise score attempt for a student in the reports.
/*$_configuration['add_exercise_best_attempt_in_report'] = [
'courses' => [
'ABC' => [88, 89], // Where ABC is the course code and 88 is the exercise id
]
];*/

// KEEP THIS AT THE END
// -------- Custom DB changes
// Add user activation by confirmation email
Expand Down
32 changes: 28 additions & 4 deletions main/tracking/courseLog.php
Expand Up @@ -493,7 +493,7 @@ function(index) {
$scoresDistribution[$reducedAverage]++;
}
$scoreStudent = substr($userTracking[5], 0, -1) + substr($userTracking[7], 0, -1);
list($hours, $minutes, $seconds) = preg_split('/:/', $userTracking[4]);
[$hours, $minutes, $seconds] = preg_split('/:/', $userTracking[4]);
$minutes = round((3600 * $hours + 60 * $minutes + $seconds) / 60);

$certificate = false;
Expand Down Expand Up @@ -548,9 +548,6 @@ function(index) {
$mainForm->addHtml($formClass->returnForm());
$mainForm->addHtml($formExtraField->returnForm());
$mainForm->addHtml('</div>');

//$html .= $formClass->returnForm();
//$html .= $formExtraField->returnForm();
$html .= $mainForm->returnForm();

$getLangXDays = get_lang('XDays');
Expand Down Expand Up @@ -671,6 +668,7 @@ function(index) {
false
);
$headers['exercise_average'] = get_lang('ExerciseAverage');

$table->set_header(
$headerCounter++,
get_lang('Score').'&nbsp;'.
Expand All @@ -687,6 +685,27 @@ function(index) {
);
$headers['score_best'] = $bestScoreLabel;

$addExerciseOption = api_get_configuration_value('add_exercise_best_attempt_in_report');
$exerciseResultHeaders = [];
if (!empty($addExerciseOption) && isset($addExerciseOption['courses']) &&
isset($addExerciseOption['courses'][$courseCode])
) {
foreach ($addExerciseOption['courses'][$courseCode] as $exerciseId) {
$exercise = new Exercise();
$exercise->read($exerciseId);
if ($exercise->iId) {
$title = get_lang('Exercise').': '.$exercise->get_formated_title();
$table->set_header(
$headerCounter++,
$title,
false
);
$exerciseResultHeaders[] = $title;
$headers['exercise_'.$exercise->iId] = $title;
}
}
}

$table->set_header($headerCounter++, get_lang('Student_publication'), false);
$headers['student_publication'] = get_lang('Student_publication');
$table->set_header($headerCounter++, get_lang('Messages'), false);
Expand Down Expand Up @@ -986,6 +1005,11 @@ function(index) {
$csv_headers[] = get_lang('ExerciseAverage');
$csv_headers[] = get_lang('Score');
$csv_headers[] = $bestScoreLabel;
if (!empty($exerciseResultHeaders)) {
foreach ($exerciseResultHeaders as $exerciseLabel) {
$csv_headers[] = $exerciseLabel;
}
}
$csv_headers[] = get_lang('Student_publication');
$csv_headers[] = get_lang('Messages');
if (empty($sessionId)) {
Expand Down

0 comments on commit defa11b

Please sign in to comment.