in locallib.php [200:366]
public function save(stdClass $submission, stdClass $data) {
global $USER, $DB, $COURSE;
// Get OneNote page id.
$record = $DB->get_record('local_onenote_assign_pages',
array("assign_id" => $submission->assignment, "user_id" => $submission->userid));
if (!$record || !$record->submission_student_page_id) {
$this->set_error(get_string('submissionnotstarted', 'assignsubmission_onenote'));
return false;
}
try {
$onenoteapi = \local_onenote\api\base::getinstance();
} catch (\Exception $e) {
// Display error.
$this->set_error($e->getMessage());
return false;
}
$tempfolder = $onenoteapi->create_temp_folder();
$tempfile = join(DIRECTORY_SEPARATOR, array(rtrim($tempfolder, DIRECTORY_SEPARATOR), uniqid('asg_'))) . '.zip';
// Create zip file containing onenote page and related files.
$o365userid = \local_o365\utils::get_o365_userid($USER->id);
$downloadinfo = $onenoteapi->download_page($record->submission_student_page_id, $tempfile, $o365userid);
if (!$downloadinfo) {
if ($onenoteapi->is_logged_in()) {
$this->set_error(get_string('submissiondownloadfailed', 'assignsubmission_onenote'));
} else {
$this->set_error(get_string('notsignedin', 'assignsubmission_onenote'));
}
return false;
}
// Retrieve OneNote page metadata and save the last time modified.
$pagemetadata = $onenoteapi->get_page_metadata($record->submission_student_page_id);
if (\local_o365\rest\unified::is_configured() === true) {
$modtimeparam = 'lastModifiedDateTime';
} else {
$modtimeparam = 'lastModifiedTime';
}
$pagemetadata = $onenoteapi->process_apicall_response($pagemetadata, [$modtimeparam => null]);
if (!empty($pagemetadata)) {
$record->student_lastmodified = strtotime($pagemetadata[$modtimeparam]);
$DB->update_record('local_onenote_assign_pages', $record);
}
// Get assignment submission size limit.
$submissionlimit = $this->get_config('maxsubmissionsizebytes');
// Get submission zip size.
$submissionsize = filesize($downloadinfo['path']);
// Check if assignment submission limit is zero, i.e. when user selected course upload limit.
if ($submissionlimit == 0) {
// Check if submission size is greater than course upload limit.
if (($COURSE->maxbytes > 0) && ($submissionsize > $COURSE->maxbytes)) {
// Display error if true.
$this->set_error(get_string('submissionlimitexceed', 'assignsubmission_onenote'));
return false;
}
// Check if submission size is greater assignment submission limit.
} else if ($submissionsize > $submissionlimit) {
// Display error if true.
$this->set_error(get_string('submissionlimitexceed', 'assignsubmission_onenote'));
return false;
}
$fs = get_file_storage();
// Delete any previous attempts.
$fs->delete_area_files($this->assignment->get_context()->id, 'assignsubmission_onenote',
\local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA, $submission->id);
// Prepare file record object.
$fileinfo = array(
'contextid' => $this->assignment->get_context()->id,
'component' => 'assignsubmission_onenote',
'filearea' => \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA,
'itemid' => $submission->id,
'filepath' => '/',
'filename' => 'OneNote_' . time() . '.zip'
);
// Save it.
$fs->create_file_from_pathname($fileinfo, $downloadinfo['path']);
fulldelete($tempfolder);
$filesubmission = $this->get_file_submission($submission->id);
// Plagiarism code event trigger when files are uploaded.
$files = $fs->get_area_files($this->assignment->get_context()->id, 'assignsubmission_onenote',
\local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA, $submission->id, 'id', false);
$count = $this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);
$params = array(
'context' => context_module::instance($this->assignment->get_course_module()->id),
'courseid' => $this->assignment->get_course()->id,
'objectid' => $submission->id,
'other' => array(
'content' => '',
'pathnamehashes' => array_keys($files)
)
);
if (!empty($submission->userid) && ($submission->userid != $USER->id)) {
$params['relateduserid'] = $submission->userid;
}
$event = \assignsubmission_onenote\event\assessable_uploaded::create($params);
$event->set_legacy_files($files);
$event->trigger();
$groupname = null;
$groupid = 0;
// Get the group name as other fields are not transcribed in the logs and this information is important.
if (empty($submission->userid) && !empty($submission->groupid)) {
$groupname = $DB->get_field('groups', 'name', array('id' => $submission->groupid), '*', MUST_EXIST);
$groupid = $submission->groupid;
} else {
$params['relateduserid'] = $submission->userid;
}
// Unset the objectid and other field from params for use in submission events.
unset($params['objectid']);
unset($params['other']);
$params['other'] = array(
'submissionid' => $submission->id,
'submissionattempt' => $submission->attemptnumber,
'submissionstatus' => $submission->status,
'filesubmissioncount' => $count,
'groupid' => $groupid,
'groupname' => $groupname
);
if ($filesubmission) {
$filesubmission->numfiles =
$this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);
$updatestatus = $DB->update_record('assignsubmission_onenote', $filesubmission);
$params['objectid'] = $filesubmission->id;
$event = \assignsubmission_onenote\event\submission_updated::create($params);
$event->set_assign($this->assignment);
$event->trigger();
return $updatestatus;
} else {
$filesubmission = new stdClass();
$filesubmission->numfiles =
$this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);
$filesubmission->submission = $submission->id;
$filesubmission->assignment = $this->assignment->get_instance()->id;
$filesubmission->id = $DB->insert_record('assignsubmission_onenote', $filesubmission);
$params['objectid'] = $filesubmission->id;
$event = \assignsubmission_onenote\event\submission_created::create($params);
$event->set_assign($this->assignment);
$event->trigger();
return $filesubmission->id > 0;
}
}