From fe3df1b33d0453c715ef8f95d4a692b9cff62b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinczi=20Konr=C3=A1d?= Date: Sat, 25 Feb 2023 18:22:04 +0100 Subject: [PATCH] Fix MDL-76590 --- mod/assign/feedback/editpdf/ajax.php | 8 + .../feedback/editpdf/classes/document_services.php | 226 +++++++++++++++++++++ 2 files changed, 234 insertions(+) diff --git a/mod/assign/feedback/editpdf/ajax.php b/mod/assign/feedback/editpdf/ajax.php index 07f1188..0db763d 100644 --- a/mod/assign/feedback/editpdf/ajax.php +++ b/mod/assign/feedback/editpdf/ajax.php @@ -81,6 +81,14 @@ if ($action === 'pollconversions') { die(); } + // Check if we have a submission for current attempt + $has_submission = document_services::has_submission($assignment, $userid, $attemptnumber); + + // If we have no submission for current attempt, cleanup the preview files + if (!$has_submission) { + document_services::cleanup_preview_files($assignment, $userid, $attemptnumber); + } + // Obtained lock, now process the assignment conversion. try { $response = (object) [ diff --git a/mod/assign/feedback/editpdf/classes/document_services.php b/mod/assign/feedback/editpdf/classes/document_services.php index 739ac40..7f07c7c 100644 --- a/mod/assign/feedback/editpdf/classes/document_services.php +++ b/mod/assign/feedback/editpdf/classes/document_services.php @@ -1078,4 +1078,230 @@ EOD; return $newfile; } + /** + * This function gets the user submission filenames for the attempt. + * + * @param int|\assign $assignment + * @param int $userid + * @param int $attemptnumber (-1 means latest attempt) + * @return array(assign_submission_file) + * @throw moodle_exception if no permission to view submission + */ + public static function get_submission_filenames($assignment, $userid, $attemptnumber) { + + $assignment = self::get_assignment_from_param($assignment); + + if (!$assignment->can_view_submission($userid)) { + throw new \moodle_exception('nopermission'); + } + + if ($assignment->get_instance()->teamsubmission) { + $submission = $assignment->get_group_submission($userid, 0, false, $attemptnumber); + } else { + $submission = $assignment->get_user_submission($userid, false, $attemptnumber); + } + + $grade = $assignment->get_user_grade($userid, true, $attemptnumber); + $itemid = $grade->id; + $contextid = $assignment->get_context()->id; + $component = 'assignsubmission_file'; + $filearea_submission = ASSIGNSUBMISSION_FILE_FILEAREA; + $filepath = '/'; + $fs = get_file_storage(); + + // Get submission files for component 'assignsubmission_file' from the file table + $submission_files_obj = $fs->get_area_files($assignment->get_context()->id, + 'assignsubmission_file', + $filearea_submission, + $submission->id, + false); + + // Get submission filenames from the object + foreach ($submission_files_obj as $submission_file) { + $submission_filenames[] = $submission_file->get_filename(); + } + + return $submission_filenames; + } + + /** + * This function checks if the user has existing submission for the attempt. + * + * @param int|\assign $assignment + * @param int $userid + * @param int $attemptnumber (-1 means latest attempt) + * @return bool + * @throw moodle_exception if no permission to view submission + */ + public static function has_submission($assignment, $userid, $attemptnumber) { + + if (!$assignment->can_view_submission($userid)) { + throw new \moodle_exception('nopermission'); + } + + $submission_filenames = document_services::get_submission_filenames($assignment, $userid, $attemptnumber); + + // Return true, if we have submission + if (count($submission_filenames)) { + return true; + } + + return false; + } + + /** + * This function gets the generated preview images or stamps or the combined.pdf file for the attempt. + * + * @param int|\assign $assignment + * @param int $userid + * @param int $attemptnumber (-1 means latest attempt) + * @return array ( + * 'count_filenames' => $count_filenames, + * 'filenames_page' => $filenames_page, + * 'filenames_combined' => $filenames_combined, + * 'filenames_stamps' => $filenames_stamps + * ); + * @throw moodle_exception if no permission to view submission + */ + public static function get_preview_files($assignment, $userid, $attemptnumber) { + + $assignment = self::get_assignment_from_param($assignment); + $grade = $assignment->get_user_grade($userid, true, $attemptnumber); + $itemid = $grade->id; + $contextid = $assignment->get_context()->id; + + if (!$assignment->can_view_submission($userid)) { + throw new \moodle_exception('nopermission'); + } + + $fs = get_file_storage(); + $component = 'assignfeedback_editpdf'; + + // Get file list stored in PAGE_IMAGE_FILEAREA + $filearea_page = document_services::PAGE_IMAGE_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_page, $grade->id); + $filenames_page = array(); + $filenames_page_itemid = array(); + foreach ($files_area as $file_obj) { + $filenames_page[] = $file_obj->get_filename(); + } + + // Get file list stored in COMBINED_PDF_FILEAREA + $filearea_combined = document_services::COMBINED_PDF_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_combined, $grade->id); + $filenames_combined = array(); + $filenames_combined_itemid = array(); + foreach ($files_area as $file_obj) { + $filenames_combined[] = $file_obj->get_filename(); + } + + // Get file list stored in STAMPS_FILEAREA + $filearea_stamps = document_services::STAMPS_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_stamps, $grade->id); + $filenames_stamps = array(); + $filenames_stamps_itemid = array(); + foreach ($files_area as $file_obj) { + $filenames_stamps[] = $file_obj->get_filename(); + } + $count_filenames = (count(array_values($filenames_page)) + count(array_values($filenames_combined)) + count(array_values($filenames_stamps)) ); + + return array ( + 'count_filenames' => $count_filenames, + 'filenames_page' => $filenames_page, + 'filenames_combined' => $filenames_combined, + 'filenames_stamps' => $filenames_stamps + ); + } + + + /** + * This function checks, if the assignment user attempt has existing generated preview images or combined.pdf file for the attempt. + * + * @param int|\assign $assignment + * @param int $userid + * @param int $attemptnumber (-1 means latest attempt) + * @return bool + * @throw moodle_exception if no permission to view submission + */ + public static function has_preview_files($assignment, $userid, $attemptnumber) { + + if (!$assignment->can_view_submission($userid)) { + throw new \moodle_exception('nopermission'); + } + + // Get the generated preview images or stamps or the combined.pdf file for the attempt + $preview_files_result = self::get_preview_files($assignment, $userid, $attemptnumber); + $count_preview_files = $preview_files_result['count_filenames']; + + // Return true, if we have preview files + if ($count_preview_files) { return true; } + + return false; + } + + + /** + * This function cleans up the generated preview images and the combined.pdf file for the attempt. + * + * @param int|\assign $assignment + * @param int $userid + * @param int $attemptnumber (-1 means latest attempt) + * @return stdClass $submission + * @throws moodle_exception if we had an issue cleaning up preview pages + */ + public static function cleanup_preview_files($assignment, $userid, $attemptnumber) { + + $assignment = self::get_assignment_from_param($assignment); + $grade = $assignment->get_user_grade($userid, true, $attemptnumber); + $itemid = $grade->id; + $contextid = $assignment->get_context()->id; + + if (!$assignment->can_view_submission($userid)) { + throw new \moodle_exception('nopermission'); + } + + // Check if the user attempt has existing generated preview images or combined.pdf file for the attempt. + $has_preview_files = self::has_preview_files($assignment, $userid, $attemptnumber); + + $component = 'assignfeedback_editpdf'; + $filearea = document_services::PAGE_IMAGE_FILEAREA; + $filepath = '/'; + $fs = get_file_storage(); + + try { + // Cleanup the generated, but unused page images in PAGE_IMAGE_FILEAREA filearea + $filearea_page = document_services::PAGE_IMAGE_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_page, $itemid); + foreach ($files_area as $file_obj) { + $filenames_page[] = $file_obj->get_filename(); + $filenames_page[] = $file_obj->get_itemid(); + $file_obj->delete(); + } + + // Cleanup the generated, but unused combined.pdf in COMBINED_PDF_FILEAREA filearea + $filearea_combined = document_services::COMBINED_PDF_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_combined, $itemid); + foreach ($files_area as $file_obj) { + $filenames_combined[] = $file_obj->get_filename(); + $filenames_combined[] = $file_obj->get_itemid(); + $file_obj->delete(); + } + + // Cleanup the generated, but unused stamps in STAMPS_FILEAREA filearea + $filearea_stamps = document_services::STAMPS_FILEAREA; + $files_area = $fs->get_area_files($contextid, $component, $filearea_stamps, $itemid); + foreach ($files_area as $file_obj) { + $filenames_stamps[] = $file_obj->get_filename(); + $filenames_stamps[] = $file_obj->get_itemid(); + $file_obj->delete(); + } + + } catch (\moodle_exception $e) { + // We catched a moodle_exception, which indicate we had an issue cleaning up the preview pages + throw new \moodle_exception('We had an error cleaning up preview pages for grade: ' . $itemid . ', attemptnumber: ' . $attemptnumber . ', error: ' . $e); + return false; + } + return true; + } + } -- 2.10.1.windows.1