public function execute() { global $CFG, $DB; require_once $CFG->dirroot . '/mod/emarking/lib.php'; require_once $CFG->dirroot . '/mod/emarking/locallib.php'; require_once $CFG->dirroot . '/mod/emarking/print/locallib.php'; $digitizedanswerfiles = emarking_get_digitized_answer_files(NULL, EMARKING_DIGITIZED_ANSWER_UPLOADED); if (count($digitizedanswerfiles) == 0) { mtrace('No digitized answers files to process'); return; } $totalfiles = 0; // Setup de directorios temporales. $tempdir = emarking_get_temp_dir_path(random_string()); emarking_initialize_directory($tempdir, true); foreach ($digitizedanswerfiles as $digitizedanswerfile) { if (!($zipfile = emarking_get_path_from_hash($tempdir, $digitizedanswerfile->hash))) { mtrace('Invalid file for processing ' . $digitizedanswerfile->id); continue; } if (!($emarking = $DB->get_record('emarking', array('id' => $digitizedanswerfile->emarking)))) { mtrace('Invalid emarking activity ' . $digitizedanswerfile->emarking); continue; } if (!($course = $DB->get_record('course', array('id' => $emarking->course)))) { mtrace('Invalid course in emarking activity ' . $emarking->course); continue; } if (!($cm = get_coursemodule_from_instance('emarking', $emarking->id))) { mtrace('Invalid course module for emarking activity ' . $emarking->id); continue; } $totalfiles++; $msg = "[{$totalfiles}] : {$course->fullname} ({$course->id}) : {$emarking->name} ({$emarking->id}) : {$digitizedanswerfile->filename} ({$digitizedanswerfile->id})"; $digitizedanswerfile->status = EMARKING_DIGITIZED_ANSWER_BEING_PROCESSED; $DB->update_record('emarking_digitized_answers', $digitizedanswerfile); // Process documents and obtain results. list($result, $errors, $totaldocumentsprocessed, $totaldocumentsignored) = emarking_upload_answers($emarking, $zipfile, $course, $cm); if ($result) { $digitizedanswerfile->status = EMARKING_DIGITIZED_ANSWER_PROCESSED; } else { $digitizedanswerfile->status = EMARKING_DIGITIZED_ANSWER_ERROR_PROCESSING; } $digitizedanswerfile->totalpages = $totaldocumentsprocessed; $digitizedanswerfile->identifiedpages = $totaldocumentsprocessed - $totaldocumentsignored; $msg .= emarking_get_string_for_status_digitized($digitizedanswerfile->status) . ' processed:' . $totaldocumentsprocessed . ' ignored:' . $totaldocumentsignored; $DB->update_record('emarking_digitized_answers', $digitizedanswerfile); mtrace($msg); } mtrace("A total of {$totalfiles} were processed."); }
private function fill_with_magic() { global $DB, $CFG; $students = get_users_by_capability($this->context, 'mod/emarking:submit'); $emarking = $DB->get_record('emarking', array("id" => $this->cm->instance)); $context = $this->context; $courseid = $this->cm->course; $testfolder = $CFG->dirroot . '/mod/emarking/tests/img'; $tempdir = emarking_get_temp_dir_path($emarking->id); emarking_initialize_directory($tempdir, true); foreach ($students as $student) { copy($testfolder . "/test1.png", $tempdir . '/' . $student->id . '-' . $courseid . '-1.png'); copy($testfolder . "/test1_a.png", $tempdir . '/' . $student->id . '-' . $courseid . '-1_a.png'); copy($testfolder . "/test2.png", $tempdir . '/' . $student->id . '-' . $courseid . '-2.png'); copy($testfolder . "/test2_a.png", $tempdir . '/' . $student->id . '-' . $courseid . '-2_a.png'); emarking_submit($emarking, $context, $tempdir, $student->id . '-' . $courseid . '-1.png', $student, 1); emarking_submit($emarking, $context, $tempdir, $student->id . '-' . $courseid . '-2.png', $student, 2); } }
echo $OUTPUT->header(); echo $OUTPUT->box_start('generalbox'); echo $OUTPUT->heading(get_string('error')); echo $OUTPUT->error_text(get_string('fileisnotzip', 'mod_emarking')); echo $OUTPUT->continue_button($urlemarking); echo $OUTPUT->box_end(); echo $OUTPUT->footer(); die; } // Parameters for execution $merge = isset($mform->get_data()->merge) ? false : true; // Inverted as question in form was inverted $nocache = rand(1, 999999); // File is ok, process // Setup de directorios temporales $tempdir = emarking_get_temp_dir_path($emarking->id); emarking_initialize_directory($tempdir, true); // Gets file hash $newfile = emarking_get_path_from_hash($tempdir, $file->get_pathnamehash(), '', true); // Display confirmation page before moving to process echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('confirmprocess', 'mod_emarking')); echo $OUTPUT->tabtree(emarking_tabs($context, $cm, $emarking), "uploadanswers"); echo $OUTPUT->box_start('generalbox'); // If the user confirms it goes to process.php $confirmurl = new moodle_url('/mod/emarking/print/processanswers.php', array('merge' => $merge, 'file' => $file->get_pathnamehash(), 'emarkingid' => $emarking->id)); // Message changes if it will be merged $confirmessage = $merge ? 'confirmprocessfilemerge' : 'confirmprocessfile'; // Show confirmation buttons echo $OUTPUT->confirm(get_string($confirmessage, 'mod_emarking', array('file' => $file->get_filename(), 'assignment' => $emarking->name)), $confirmurl, $urlemarking); echo $OUTPUT->box_end();
/** * Validates the answer key file * @param unknown $data * @return multitype:Ambigous <string, lang_string> |multitype:string Ambigous <string, lang_string> */ private function get_answerkey_file_errors($data) { global $USER, $COURSE; $errors = array(); // We get the draftid from the form. $draftid = file_get_submitted_draft_itemid('answerkeyfile'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->is_directory()) { continue; } if ($uploadedfile->get_mimetype() !== 'application/pdf') { $errors['exam_files'] = get_string('invalidfilenotpdf', 'mod_emarking') . '_' . $uploadedfile->get_mimetype() . '_' . $uploadedfile->get_filename(); return $errors; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated. $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1) { $errors['exam_files'] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } if ($numpagesprevious >= 0 && $numpagesprevious != $numpages) { $errors['exam_files'] = get_string('invalidpdfnumpagesforms', 'mod_emarking'); return $errors; } $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } if (count($exampdfs) == 0 && $data['exam'] == 0) { $errors['exam_files'] = get_string('filerequiredtosendnewprintorder', 'mod_emarking'); return $errors; } return $errors; }
/** * Saves a new instance of the emarking into the database * * Given an object containing all the necessary data, * (defined by the form in mod_form.php) this function * will create a new instance and return the id number * of the new instance. * * @param object $emarking * An object from the form in mod_form.php * @param mod_emarking_mod_form $mform * @return int The id of the newly inserted emarking record */ function emarking_add_instance(stdClass $data, mod_emarking_mod_form $mform = null) { global $DB, $CFG, $COURSE, $USER; $data->timecreated = time(); $id = $DB->insert_record('emarking', $data); $data->id = $id; emarking_grade_item_update($data); if ($data->type == EMARKING_TYPE_MARKER_TRAINING) { return $id; } foreach ($data as $k => $v) { $parts = explode('-', $k); if (count($parts) > 1 && $parts[0] === 'marker') { $markerid = intval($parts[1]); $marker = new stdClass(); $marker->emarking = $id; $marker->marker = $markerid; $marker->qualitycontrol = 1; $DB->insert_record('emarking_markers', $marker); } } $context = context_course::instance($COURSE->id); $examid = 0; // If there's no previous exam to associate, and we are creating a new // e-marking, we need the PDF file if ($data->exam == 0) { // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } } else { $examid = $data->exam; } $studentsnumber = emarking_get_students_count_for_printing($COURSE->id); // A new exam object is created and its attributes filled from form data if ($examid == 0) { $exam = new stdClass(); $exam->course = $COURSE->id; $exam->courseshortname = $COURSE->shortname; $exam->name = $mform->get_data()->name; $exam->examdate = $mform->get_data()->examdate; $exam->emarking = $id; $exam->headerqr = isset($mform->get_data()->headerqr) ? 1 : 0; $exam->printrandom = isset($mform->get_data()->printrandom) ? 1 : 0; $exam->printlist = isset($mform->get_data()->printlist) ? 1 : 0; $exam->extrasheets = $mform->get_data()->extrasheets; $exam->extraexams = $mform->get_data()->extraexams; $exam->usebackside = isset($mform->get_data()->printdoublesided) ? 1 : 0; if ($examid == 0) { $exam->timecreated = time(); } $exam->timemodified = time(); $exam->requestedby = $USER->id; $exam->totalstudents = $studentsnumber; // Get the enrolments as a comma separated values $enrollist = array(); if (!empty($mform->get_data()->enrolments)) { $enrolments = $mform->get_data()->enrolments; foreach ($enrolments as $key => $enrolment) { if (!empty($enrolment)) { $enrollist[] = $key; } } } $exam->enrolments = implode(",", $enrollist); $exam->printdate = 0; $exam->status = EMARKING_EXAM_UPLOADED; // Calculate total pages for exam $exam->totalpages = $numpages; $exam->id = $DB->insert_record('emarking_exams', $exam); foreach ($exampdfs as $exampdf) { // Save the submitted file to check if it's a PDF $filerecord = array('component' => 'mod_emarking', 'filearea' => 'exams', 'contextid' => $context->id, 'itemid' => $exam->id, 'filepath' => '/', 'filename' => $exampdf['filename']); $file = $fs->create_file_from_pathname($filerecord, $exampdf['pathname']); } // Update exam object to store the PDF's file id $exam->file = $file->get_id(); if (!$DB->update_record('emarking_exams', $exam)) { $fs->delete_area_files($contextid, 'emarking', 'exams', $exam->id); print_error(get_string('errorsavingpdf', 'mod_emarking')); } // Send new print order notification emarking_send_newprintorder_notification($exam, $COURSE); // If it is a multi-course submission, insert several exams if (!empty($mform->get_data()->multicourse)) { $multicourse = $mform->get_data()->multicourse; foreach ($multicourse as $key => $mcourse) { if (!empty($key)) { if ($thiscourse = $DB->get_record('course', array('shortname' => $key))) { $studentsnumber = emarking_get_students_count_for_printing($thiscourse->id); $newexam = $exam; $newexam->id = null; $newexam->totalstudents = $studentsnumber; $newexam->course = $thiscourse->id; $newexam->courseshortname = $thiscourse->shortname; $newexam->emarking = 0; $newexam->id = $DB->insert_record('emarking_exams', $newexam); $thiscontext = context_course::instance($thiscourse->id); // Create file records for all new exams foreach ($exampdfs as $exampdf) { // Save the submitted file to check if it's a PDF $filerecord = array('component' => 'mod_emarking', 'filearea' => 'exams', 'contextid' => $thiscontext->id, 'itemid' => $newexam->id, 'filepath' => '/', 'filename' => $exampdf['filename']); $file = $fs->create_file_from_pathname($filerecord, $exampdf['pathname']); } // Send new print order notification emarking_send_newprintorder_notification($newexam, $thiscourse); } } } } } else { $exam = $DB->get_record("emarking_exams", array("id" => $examid)); $exam->emarking = $id; $exam->timemodified = time(); $DB->update_record('emarking_exams', $exam); } $headerqr = isset($mform->get_data()->headerqr) ? 1 : 0; setcookie("emarking_headerqr", $headerqr, time() + 3600 * 24 * 365 * 10, '/'); $defaultexam = new stdClass(); $defaultexam->headerqr = $exam->headerqr; $defaultexam->printrandom = $exam->printrandom; $defaultexam->printlist = $exam->printlist; $defaultexam->extrasheets = $exam->extrasheets; $defaultexam->extraexams = $exam->extraexams; $defaultexam->usebackside = $exam->usebackside; $defaultexam->enrolments = $exam->enrolments; setcookie("emarking_exam_defaults", json_encode($defaultexam), time() + 3600 * 24 * 365 * 10, '/'); return $id; }
/** * Creates the PDF version (downloadable) of the whole feedback produced by the teacher/tutor * * @param unknown $draft * @param unknown $student * @param unknown $context * @param unknown $cmid * @return boolean */ function emarking_create_response_pdf($draft, $student, $context, $cmid) { global $CFG, $DB; require_once $CFG->libdir . '/pdflib.php'; $fs = get_file_storage(); if (!($submission = $DB->get_record('emarking_submission', array('id' => $draft->submissionid)))) { return false; } if (!($pages = $DB->get_records('emarking_page', array('submission' => $submission->id, 'student' => $student->id), 'page ASC'))) { return false; } if (!($emarking = $DB->get_record('emarking', array('id' => $submission->emarking)))) { return false; } $numpages = count($pages); $sqlcomments = "SELECT ec.id,\n\t\t\tec.posx,\n\t\t\tec.posy,\n\t\t\tec.rawtext,\n\t\t\tec.pageno,\n\t\t\tgrm.maxscore,\n\t\t\tec.levelid,\n\t\t\tec.width,\n\t\t\tec.colour,\n\t\t\tec.textformat,\n\t\t\tgrl.score AS score,\n\t\t\tgrl.definition AS leveldesc,\n\t\t\tgrc.id AS criterionid,\n\t\t\tgrc.description AS criteriondesc,\n\t\t\tu.id AS markerid, CONCAT(u.firstname,' ',u.lastname) AS markername\n\t\t\tFROM {emarking_comment} AS ec\n\t\t\tINNER JOIN {emarking_page} AS ep ON (ec.draft = :draft AND ec.page = ep.id)\n\t\t\tLEFT JOIN {user} AS u ON (ec.markerid = u.id)\n\t\t\tLEFT JOIN {gradingform_rubric_levels} AS grl ON (ec.levelid = grl.id)\n\t\t\tLEFT JOIN {gradingform_rubric_criteria} AS grc ON (grl.criterionid = grc.id)\n\t\t\tLEFT JOIN (\n\t\t\tSELECT grl.criterionid, max(score) AS maxscore\n\t\t\tFROM {gradingform_rubric_levels} AS grl\n\t\t\tGROUP BY grl.criterionid\n\t\t\t) AS grm ON (grc.id = grm.criterionid)\n\t\t\tWHERE ec.pageno > 0\n\t\t\tORDER BY ec.pageno"; $params = array('draft' => $draft->id); $comments = $DB->get_records_sql($sqlcomments, $params); $commentsperpage = array(); foreach ($comments as $comment) { if (!isset($commentsperpage[$comment->pageno])) { $commentsperpage[$comment->pageno] = array(); } $commentsperpage[$comment->pageno][] = $comment; } // Parameters for PDF generation $iconsize = 5; $tempdir = emarking_get_temp_dir_path($emarking->id); if (!file_exists($tempdir)) { mkdir($tempdir); } // create new PDF document $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // set document information $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor($student->firstname . ' ' . $student->lastname); $pdf->SetTitle($emarking->name); $pdf->SetSubject('Exam feedback'); $pdf->SetKeywords('feedback, emarking'); $pdf->SetPrintHeader(false); $pdf->SetPrintFooter(false); // set default header data $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE . ' 036', PDF_HEADER_STRING); // set header and footer fonts $pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); // set default monospaced font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); // set margins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); // set auto page breaks $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // set image scale factor $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); // set some language-dependent strings (optional) if (@file_exists(dirname(__FILE__) . '/lang/eng.php')) { require_once dirname(__FILE__) . '/lang/eng.php'; $pdf->setLanguageArray($l); } // --------------------------------------------------------- // set font $pdf->SetFont('times', '', 16); foreach ($pages as $page) { // add a page $pdf->AddPage(); // get the current page break margin $bMargin = $pdf->getBreakMargin(); // get current auto-page-break mode $auto_page_break = $pdf->getAutoPageBreak(); // disable auto-page-break $pdf->SetAutoPageBreak(false, 0); // set bacground image $pngfile = $fs->get_file_by_id($page->file); $img_file = emarking_get_path_from_hash($tempdir, $pngfile->get_pathnamehash()); $pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0); // restore auto-page-break status // $pdf->SetAutoPageBreak($auto_page_break, $bMargin); // set the starting point for the page content $pdf->setPageMark(); $dimensions = $pdf->getPageDimensions(); if (isset($commentsperpage[$page->page])) { foreach ($commentsperpage[$page->page] as $comment) { $content = $comment->rawtext; $posx = (int) ((double) $comment->posx * $dimensions['w']); $posy = (int) ((double) $comment->posy * $dimensions['h']); if ($comment->textformat == 1) { // text annotation $pdf->Annotation($posx, $posy, 6, 6, $content, array('Subtype' => 'Text', 'StateModel' => 'Review', 'State' => 'None', 'Name' => 'Comment', 'NM' => 'Comment' . $comment->id, 'T' => $comment->markername, 'Subj' => 'example', 'C' => array(0, 0, 255))); } elseif ($comment->textformat == 2) { $content = $comment->criteriondesc . ': ' . round($comment->score, 1) . '/' . round($comment->maxscore, 1) . "\n" . $comment->leveldesc . "\n" . get_string('comment', 'mod_emarking') . ': ' . $content; // text annotation $pdf->Annotation($posx, $posy, 6, 6, $content, array('Subtype' => 'Text', 'StateModel' => 'Review', 'State' => 'None', 'Name' => 'Comment', 'NM' => 'Mark' . $comment->id, 'T' => $comment->markername, 'Subj' => 'grade', 'C' => array(255, 255, 0))); } elseif ($comment->textformat == 3) { $pdf->Image($CFG->dirroot . "/mod/emarking/img/check.gif", $posx, $posy, $iconsize, $iconsize, '', '', '', false, 300, '', false, false, 0); } elseif ($comment->textformat == 4) { $pdf->Image($CFG->dirroot . "/mod/emarking/img/crossed.gif", $posx, $posy, $iconsize, $iconsize, '', '', '', false, 300, '', false, false, 0); } } } } // --------------------------------------------------------- // COGIDO PARA IMPRIMIR RÚBRICA if ($emarking->downloadrubricpdf) { $cm = new StdClass(); $rubricdesc = $DB->get_recordset_sql("SELECT\n\t\td.name AS rubricname,\n\t\ta.id AS criterionid,\n\t\ta.description ,\n\t\tb.definition,\n\t\tb.id AS levelid,\n\t\tb.score,\n\t\tIFNULL(E.id,0) AS commentid,\n\t\tIFNULL(E.pageno,0) AS commentpage,\n\t\tE.rawtext AS commenttext,\n\t\tE.markerid AS markerid,\n\t\tIFNULL(E.textformat,2) AS commentformat,\n\t\tIFNULL(E.bonus,0) AS bonus,\n\t\tIFNULL(er.id,0) AS regradeid,\n\t\tIFNULL(er.motive,0) AS motive,\n\t\ter.comment AS regradecomment,\n\t\tIFNULL(er.markercomment, '') AS regrademarkercomment,\n\t\tIFNULL(er.accepted,0) AS regradeaccepted\n\t\tFROM {course_modules} AS c\n\t\tINNER JOIN {context} AS mc ON (c.id = :coursemodule AND c.id = mc.instanceid)\n\t\tINNER JOIN {grading_areas} AS ar ON (mc.id = ar.contextid)\n\t\tINNER JOIN {grading_definitions} AS d ON (ar.id = d.areaid)\n\t\tINNER JOIN {gradingform_rubric_criteria} AS a ON (d.id = a.definitionid)\n\t\tINNER JOIN {gradingform_rubric_levels} AS b ON (a.id = b.criterionid)\n\t\tLEFT JOIN (\n\t\tSELECT ec.*, d.id AS draftid\n\t\tFROM {emarking_comment} AS ec\n\t\tINNER JOIN {emarking_draft} AS d ON (d.id = :draft AND ec.draft = d.id)\n\t\t) AS E ON (E.levelid = b.id)\n\t\tLEFT JOIN {emarking_regrade} AS er ON (er.criterion = a.id AND er.draft = E.draftid)\n\t\tORDER BY a.sortorder ASC, b.score ASC", array('coursemodule' => $cmid, 'draft' => $draft->id)); $table = new html_table(); $data = array(); foreach ($rubricdesc as $rd) { if (!isset($data[$rd->criterionid])) { $data[$rd->criterionid] = array($rd->description, $rd->definition . " (" . round($rd->score, 2) . " ptos. )"); } else { array_push($data[$rd->criterionid], $rd->definition . " (" . round($rd->score, 2) . " ptos. )"); } } $table->data = $data; // add extra page with rubrics $pdf->AddPage(); $pdf->Write(0, 'Rúbrica', '', 0, 'L', true, 0, false, false, 0); $pdf->SetFont('helvetica', '', 8); $tbl = html_writer::table($table); $pdf->writeHTML($tbl, true, false, false, false, ''); } // --------------------------------------------------------- $pdffilename = 'response_' . $emarking->id . '_' . $draft->id . '.pdf'; $pathname = $tempdir . '/' . $pdffilename; if (@file_exists($pathname)) { unlink($pathname); } // Close and output PDF document $pdf->Output($pathname, 'F'); // Copiar archivo desde temp a Ã�rea $file_record = array('contextid' => $context->id, 'component' => 'mod_emarking', 'filearea' => 'response', 'itemid' => $student->id, 'filepath' => '/', 'filename' => $pdffilename, 'timecreated' => time(), 'timemodified' => time(), 'userid' => $student->id, 'author' => $student->firstname . ' ' . $student->lastname, 'license' => 'allrightsreserved'); // Si el archivo ya existía entonces lo borramos if ($fs->file_exists($context->id, 'mod_emarking', 'response', $student->id, '/', $pdffilename)) { $previousfile = $fs->get_file($context->id, 'mod_emarking', 'response', $student->id, '/', $pdffilename); $previousfile->delete(); } $fileinfo = $fs->create_file_from_pathname($file_record, $pathname); return true; }
/** * Validates if the draft files uploaded by a user are valid PDF exams * * @return array list of valid PDF exam files */ function emarking_validate_exam_files_from_draft() { global $USER, $COURSE; // We get the draftid from the form. $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->is_directory() || $uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated. $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename, 'numpages' => $numpages); } return $exampdfs; }
function validation($data, $files) { global $CFG, $COURSE, $USER, $DB; require_once $CFG->dirroot . "/mod/emarking/print/locallib.php"; if ($data["type"] < 0 || $data["type"] > 5) { return array("type" => get_string("markingtypemandatory", "mod_emarking")); } // Calculates context for validating permissions // If we have the module available, we use it, otherwise we fallback to course $ctx = context_course::instance($COURSE->id); if ($this->current && $this->current->coursemodule) { $cm = get_coursemodule_from_id('emarking', $this->current->module, $COURSE->id); if ($cm) { $ctx = context_module::instance($cm->id); } } $errors = array(); // Verify that we have enough markers if ($data['type'] == EMARKING_TYPE_MARKER_TRAINING) { // Get all users with permission to grade in emarking $markers = get_enrolled_users($ctx, 'mod/emarking:grade'); $totalmarkers = 0; foreach ($markers as $marker) { if (has_capability('mod/emarking:supervisegrading', $ctx, $marker)) { continue; } $totalmarkers++; } if ($totalmarkers < 2) { $errors['type'] = get_string('notenoughmarkersfortraining', 'mod_emarking'); return $errors; } return $errors; } // Get the exam if we are updating an emarking activity $exam = null; if (isset($data['exam']) && $data['exam'] > 0) { if (!($exam = $DB->get_record("emarking_exams", array("id" => $data["exam"])))) { $errors["exam"] = "Invalid data from form"; } } // If there is no associated exam yet if (!$exam) { // The exam date comes from the date selector $examdate = new DateTime(); $examdate->setTimestamp(usertime($data['examdate'])); // Day of week from 0 Sunday to 6 Saturday $examw = date("w", $examdate->getTimestamp()); // Hour of the day un 00 to 23 format $examh = date("H", $examdate->getTimestamp()); // If minimum days for printing is enabled if (isset($CFG->emarking_minimumdaysbeforeprinting) && $CFG->emarking_minimumdaysbeforeprinting > 0) { // Sundays are forbidden, saturdays from 6am to 4pm TODO: Move this settings to eMarking settings if ($examw == 0 || $examw == 6 && ($examh < 6 || $examh > 16)) { $errors['examdate'] = get_string('examdateinvaliddayofweek', 'mod_emarking'); } // User date. Important because the user sees a date selector based on her timezone settings, not the server's $date = usertime(time()); // Today is the date according to the user's timezone $today = new DateTime(); $today->setTimestamp($date); // We have a minimum difference otherwise we wouldn't be in this part of the code $mindiff = intval($CFG->emarking_minimumdaysbeforeprinting); // If today is saturday or sunday, demand for a bigger difference $todayw = date("w", $today->getTimestamp()); $todayw = $todayw ? $todayw : 7; if ($todayw > 5) { $mindiff += $todayw - 5; } // DateInterval calculated with diff $diff = $today->diff($examdate, false); // The difference using the invert from DateInterval so we know it is in the past $realdiff = $diff->days * ($diff->invert ? -1 : 1); // If the difference is not enough, show an error if ($realdiff < $mindiff) { $a = new stdClass(); $a->mindays = $mindiff; $errors['examdate'] = get_string('examdateinvalid', 'mod_emarking', $a); } } } // If there's no previous exam to associate, and we are creating a new // e-marking, we need the PDF file if ($data["exam"] == 0 && !$this->_instance) { // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1) { $errors["exam_files"] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } if ($numpagesprevious >= 0 && $numpagesprevious != $numpages) { $errors["exam_files"] = get_string('invalidpdfnumpagesforms', 'mod_emarking'); return $errors; } $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } if (count($exampdfs) == 0) { $errors["exam_files"] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } } // Validate the adjusted slope $adjustslope = isset($data['adjustslope']) ? $data['adjustslope'] : false; $adjustslopescore = isset($data['adjustslopescore']) ? $data['adjustslopescore'] : 0; $adjustslopegrade = isset($data['adjustslopegrade']) ? $data['adjustslopegrade'] : 0; $grademin = $data['grademin']; $grademax = $data['grade']; $regradesopendate = $data['regradesopendate']; $regradesclosedate = $data['regradesclosedate']; // Make sure the minimum score is not greater than the maximum score if ($grademin >= $grademax) { $errors['grademin'] = get_string('gradescheck', 'mod_emarking'); $errors['grade'] = get_string('gradescheck', 'mod_emarking'); } // If we are adjusting the slope if ($adjustslope) { // Make sure the grade is greater than the minimum grade if ($adjustslopegrade <= $grademin) { $errors['adjustslopegrade'] = get_string('adjustslopegrademustbegreaterthanmin', 'mod_emarking'); } // Make sure the grade is lower than the maximum grade if ($adjustslopegrade > $grademax) { $errors['adjustslopegrade'] = get_string('adjustslopegrademustbelowerthanmax', 'mod_emarking'); } // And that the score for adjusting is greater than 0 if ($adjustslopescore <= 0) { $errors['adjustslopescore'] = get_string('adjustslopescoregreaterthanzero', 'mod_emarking'); } } // Validate regrade dates if ($regradesopendate > $regradesclosedate) { $errors['regradesopendate'] = get_string('verifyregradedate', 'mod_emarking'); $errors['regradesclosedate'] = get_string('verifyregradedate', 'mod_emarking'); } // Validate custom marks $custommarks = isset($data['custommarks']) ? $data['custommarks'] : ''; $custommarks = str_replace('\\r\\n', '\\n', $custommarks); if (strlen($custommarks) > 0) { $parts = explode("\n", $custommarks); $linenumber = 0; foreach ($parts as $line) { $linenumber++; if (strlen(trim($line)) == 0) { continue; } $subparts = explode("#", $line); if (count($subparts) != 2) { if (!isset($errors['custommarks'])) { $errors['custommarks'] = get_string('invalidcustommarks', 'mod_emarking'); } $errors['custommarks'] .= "{$linenumber} "; } } } $qualitycontrol = isset($data['enablequalitycontrol']) ? $data['enablequalitycontrol'] : false; if ($data['type'] == EMARKING_TYPE_NORMAL && $qualitycontrol) { // Get all users with permission to grade in emarking // Get all users with permission to grade in emarking $markers = get_enrolled_users($ctx, 'mod/emarking:grade'); $totalmarkers = 0; foreach ($markers as $marker) { if (isset($data['marker-' . $marker->id])) { $totalmarkers++; } } if ($totalmarkers == 0) { $errors['markers'] = get_string('notenoughmarkersforqualitycontrol', 'mod_emarking'); } } if ($data["exam"] > 0 && $this->_instance) { $previousexam = $DB->get_record("emarking_exams", array("emarking" => $this->_instance)); if ($previousexam && $previousexam->id != $data["exam"]) { $errors["exam"] = "An exam is already assigned for this emarking activity"; } } return $errors; }
// The form submits to the same page, therefore these ifs control the different stages // If the cancel button was pressed, redirect to emarking home if ($mform->is_cancelled()) { redirect($cancelurl); } else { if ($data = $mform->get_data()) { // If we are editing and data was submitted delete parallel course if any if ($examid > 0) { $DB->delete_records_select('emarking_exams', "file = {$exam->file} AND id != {$examid}"); } // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($course->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1 || $numpagesprevious >= 0 && $numpagesprevious != $numpages) { echo $OUTPUT->header();
/** * Creates a QR image based on a string * * @param unknown $qrstring * @return string */ function emarking_create_qr_from_string($qrstring) { global $CFG; require_once $CFG->dirroot . '/mod/emarking/lib/phpqrcode/phpqrcode.php'; $path = emarking_get_temp_dir_path("attendance"); if (!file_exists($path)) { mkdir($path, 0777, true); } $hash = random_string(15); $time = time(); $img = $path . "/qr" . $time . $hash . ".png"; // The image is generated based on the string. QRcode::png($qrstring, $img); return $img; }