Skip to content

Commit

Permalink
Exercise: Add option to export results attempts in zip - refs BT#20691
Browse files Browse the repository at this point in the history
  • Loading branch information
cfasanando committed Apr 29, 2023
1 parent 3957b59 commit 67ff758
Show file tree
Hide file tree
Showing 7 changed files with 315 additions and 22 deletions.
170 changes: 170 additions & 0 deletions main/admin/export_exercise_results.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<?php
/* For licensing terms, see /license.txt */

$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';

// Setting the section (for the tabs).
$this_section = SECTION_PLATFORM_ADMIN;

api_protect_admin_script(true);

$sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : null;
$courseId = isset($_GET['selected_course']) ? (int) $_GET['selected_course'] : null;
$exerciseId = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : null;
$courseIdChanged = isset($_GET['course_id_changed']) ? (int) $_GET['course_id_changed'] : null;
$exerciseIdChanged = isset($_GET['exercise_id_changed']) ? (int) $_GET['exercise_id_changed'] : null;

// Get the session list
$sessionList = SessionManager::get_sessions_by_user(api_get_user_id(), api_is_platform_admin());

// Course list, get course list of session, or for course where user is admin
$courseList = [];
if (!empty($sessionId) && $sessionId != '-1' && !empty($sessionList)) {
$sessionInfo = [];
foreach ($sessionList as $session) {
if ($session['session_id'] == $sessionId) {
$sessionInfo = $session;
}
}
$courseList = $sessionInfo['courses'];
} else {
if (api_is_platform_admin()) {
$courseList = CourseManager::get_courses_list(0, 0, 'title');
} else {
$courseList = CourseManager::get_course_list_of_user_as_course_admin(api_get_user_id());
}
}

$courseInfo = [];
if (empty($courseId)) {
$exerciseId = 0;
} else {
$courseInfo = api_get_course_info_by_id($courseId);
}

$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];

$confirmYourChoice = addslashes(get_lang('ConfirmYourChoice'));
$htmlHeadXtra[] = "
<script>
function submit_form(obj) {
document.export_all_results_form.submit();
}
function mark_course_id_changed() {
$('#course_id_changed').val('0');
}
function mark_exercise_id_changed() {
$('#exercise_id_changed').val('0');
}
function confirm_your_choice() {
return confirm('$confirmYourChoice');
}
</script>";

$sessionSelectList = [0 => get_lang('Select')];
foreach ($sessionList as $item) {
$sessionSelectList[$item['session_id']] = $item['session_name'];
}

$courseSelectList = [0 => get_lang('Select')];
foreach ($courseList as $item) {
$courseItemId = $item['real_id'];
$courseInfo = api_get_course_info_by_id($courseItemId);
$courseSelectList[$courseItemId] = '';
if ($courseItemId == $courseId) {
$courseSelectList[$courseItemId] = '>&nbsp;&nbsp;&nbsp;&nbsp;';
}
$courseSelectList[$courseItemId] = $courseInfo['title'];
}

// If course has changed, reset the menu default
if (!empty($courseSelectList) && !in_array($courseId, array_keys($courseSelectList))) {
$courseId = 0;
}

$courseInfo = api_get_course_info_by_id($courseId);

// Get exercise list for this course
$exerciseList = ExerciseLib::get_all_exercises_for_course_id(
$courseInfo,
$sessionId,
$courseId,
false
);

$exerciseSelectList = [];
$exerciseSelectList = [0 => get_lang('Select')];
if (is_array($exerciseList)) {
foreach ($exerciseList as $row) {
$exerciseTitle = $row['title'];
$exerciseSelectList[$row['iid']] = $exerciseTitle;
}
}

$url = api_get_self().'?'.api_get_cidreq().'&'.http_build_query(
[
'session_id' => $sessionId,
'selected_course' => $courseId,
'exerciseId' => $exerciseId,
'course_id_changed' => $courseIdChanged,
'exercise_id_changed' => $exerciseIdChanged,
]
);

// Form
$form = new FormValidator('export_all_results_form', 'GET', $url);
$form->addHeader(get_lang('ExportExerciseAllResults'));
$form
->addSelect(
'session_id',
get_lang('Session'),
$sessionSelectList,
['onchange' => 'submit_form(this)', 'id' => 'session_id']
)
->setSelected($sessionId);
$form
->addSelect(
'selected_course',
get_lang('Course'),
$courseSelectList,
['onchange' => 'mark_course_id_changed(); submit_form(this);', 'id' => 'selected_course']
)
->setSelected($courseId);
$form
->addSelect(
'exerciseId',
get_lang('Exercise'),
$exerciseSelectList
)
->setSelected($exerciseId);

$form->addHidden('course_id_changed', '0');
$form->addHidden('exercise_id_changed', '0');
$form->addButtonExport(get_lang('Export'), 'name');

if ($form->validate()) {
$values = $form->getSubmitValues();

if (!empty($values['exerciseId']) && !empty($values['selected_course'])) {
$sessionId = (int) $values['session_id'];
$courseId = (int) $values['selected_course'];
$exerciseId = (int) $values['exerciseId'];
ExerciseLib::exportExerciseAllResultsZip($sessionId, $courseId, $exerciseId);
}
}

Display::display_header(get_lang('ExportExerciseAllResults'));

echo Display::return_message(
get_lang('ThisProcessCantakeALongTime'),
'normal',
false,
);

echo $form->display();

Display::display_footer();
5 changes: 5 additions & 0 deletions main/admin/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,11 @@
'url' => 'resource_sequence.php',
'label' => get_lang('ResourcesSequencing'),
];
$items[] = [
'class' => 'item-export-exercise-results',
'url' => 'export_exercise_results.php',
'label' => get_lang('ExportExerciseAllResults'),
];
}

$blocks['sessions']['items'] = $items;
Expand Down
28 changes: 18 additions & 10 deletions main/exercise/exercise.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -8426,7 +8426,7 @@ public function getExercisesByCourseSession($courseId, $sessionId)
*
* @return array exercises
*/
public function getExerciseAndResult($courseId, $sessionId, $quizId = [])
public function getExerciseAndResult($courseId, $sessionId, $quizId = [], $status = null)
{
if (empty($quizId)) {
return [];
Expand All @@ -8439,22 +8439,30 @@ public function getExerciseAndResult($courseId, $sessionId, $quizId = [])
$ids = array_map('intval', $ids);
$ids = implode(',', $ids);
$track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);

$condition = '';
if (isset($status)) {
$condition .= " AND te.status = '$status' ";
}

if (0 != $sessionId) {
$sql = "SELECT * FROM $track_exercises te
INNER JOIN c_quiz cq ON cq.iid = te.exe_exo_id
WHERE
te.id = %s AND
te.session_id = %s AND
cq.iid IN (%s)
INNER JOIN c_quiz cq ON cq.iid = te.exe_exo_id
WHERE
te.c_id = %s AND
te.session_id = %s AND
cq.iid IN (%s)
$condition
ORDER BY cq.iid";

$sql = sprintf($sql, $courseId, $sessionId, $ids);
} else {
$sql = "SELECT * FROM $track_exercises te
INNER JOIN c_quiz cq ON cq.iid = te.exe_exo_id
WHERE
te.id = %s AND
cq.iid IN (%s)
INNER JOIN c_quiz cq ON cq.iid = te.exe_exo_id
WHERE
te.c_id = %s AND
cq.iid IN (%s)
$condition
ORDER BY cq.iid";
$sql = sprintf($sql, $courseId, $ids);
}
Expand Down
15 changes: 15 additions & 0 deletions main/exercise/exercise_report.php
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,16 @@
$objExerciseTmp = new Exercise();
$exerciseExists = $objExerciseTmp->read($exercise_id);

$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : null;
switch ($action) {
case 'export_all_results':
$sessionId = api_get_session_id();
$courseId = api_get_course_int_id();
ExerciseLib::exportExerciseAllResultsZip($sessionId, $courseId, $exercise_id);

break;
}

//Send student email @todo move this code in a class, library
if (isset($_REQUEST['comments']) &&
$_REQUEST['comments'] === 'update' &&
Expand Down Expand Up @@ -438,6 +448,11 @@
api_get_path(WEB_CODE_PATH).'exercise/recalculate_all.php?'.api_get_cidreq()."&exercise=$exercise_id"
);

$actions .= Display::url(
Display::return_icon('export_pdf.png', get_lang('ExportExerciseAllResults'), [], ICON_SIZE_MEDIUM),
api_get_self().'?'.api_get_cidreq().'&action=export_all_results&exerciseId='.$exercise_id
);

// clean result before a selected date icon
if ($allowClean) {
$actions .= Display::url(
Expand Down
39 changes: 30 additions & 9 deletions main/exercise/exercise_show.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
$currentUserId = api_get_user_id();
$printHeaders = 'learnpath' === $origin;
$id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0; //exe id
$exportTypeAllResults = ('export' === $_GET['action'] && 'all_results' === $_GET['export_type']);

if (empty($id)) {
api_not_allowed(true);
Expand All @@ -38,15 +39,17 @@
$learnpath_item_id = $track_exercise_info['orig_lp_item_id'];
$lp_item_view_id = $track_exercise_info['orig_lp_item_view_id'];
$isBossOfStudent = false;
if (api_is_student_boss()) {
// Check if boss has access to user info.
if (UserManager::userIsBossOfStudent($currentUserId, $student_id)) {
$isBossOfStudent = true;
if (!$exportTypeAllResults) {
if (api_is_student_boss()) {
// Check if boss has access to user info.
if (UserManager::userIsBossOfStudent($currentUserId, $student_id)) {
$isBossOfStudent = true;
} else {
api_not_allowed($printHeaders);
}
} else {
api_not_allowed($printHeaders);
api_protect_course_script($printHeaders, false, true);
}
} else {
api_protect_course_script($printHeaders, false, true);
}

// Database table definitions
Expand Down Expand Up @@ -93,7 +96,8 @@
api_is_course_tutor() ||
api_is_session_admin() ||
api_is_drh() ||
api_is_student_boss();
api_is_student_boss() ||
$exportTypeAllResults;

if (!empty($sessionId) && !$is_allowedToEdit) {
if (api_is_course_session_coach(
Expand Down Expand Up @@ -982,7 +986,24 @@ class="exercise_mark_select"
'orientation' => 'P',
];
$pdf = new PDF('A4', $params['orientation'], $params);
$pdf->html_to_pdf_with_template($content, false, false, true);
if ('all_results' === $_GET['export_type']) {
$sessionId = api_get_session_id();
$courseId = api_get_course_int_id();
$exportName = 'S'.$sessionId.'-C'.$courseId.'-T'.$exercise_id;
$baseDir = api_get_path(SYS_ARCHIVE_PATH);
$folderName = 'pdfexport-'.$exportName;
$exportFolderPath = $baseDir.$folderName;
if (!is_dir($exportFolderPath)) {
@mkdir($exportFolderPath);
}
$pdfFileName = $user_info['firstname'].' '.$user_info['lastname'].'-attemptId'.$id.'.pdf';
$pdfFileName = api_replace_dangerous_char($pdfFileName);
$fileNameToSave = $exportFolderPath.'/'.$pdfFileName;
$pdf->html_to_pdf_with_template($content, true, false, true, [], 'F', $fileNameToSave);
} else {
$pdf->html_to_pdf_with_template($content, false, false, true);
}

exit;
}

Expand Down
Loading

0 comments on commit 67ff758

Please sign in to comment.