/mod/assign/feedback/editpdf/locallib.php
PHP | 297 lines | 166 code | 31 blank | 100 comment | 23 complexity | 248ae7ef2c7a55caa284e8141ea0cf24 MD5 | raw file
- <?php
- // This file is part of Moodle - http://moodle.org/
- //
- // Moodle is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // Moodle is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
- /**
- * This file contains the definition for the library class for PDF feedback plugin
- *
- *
- * @package assignfeedback_editpdf
- * @copyright 2012 Davo Smith
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
- defined('MOODLE_INTERNAL') || die();
- use \assignfeedback_editpdf\document_services;
- use \assignfeedback_editpdf\page_editor;
- /**
- * library class for editpdf feedback plugin extending feedback plugin base class
- *
- * @package assignfeedback_editpdf
- * @copyright 2012 Davo Smith
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
- class assign_feedback_editpdf extends assign_feedback_plugin {
- /** @var boolean|null $enabledcache Cached lookup of the is_enabled function */
- private $enabledcache = null;
- /**
- * Get the name of the file feedback plugin
- * @return string
- */
- public function get_name() {
- return get_string('pluginname', 'assignfeedback_editpdf');
- }
- /**
- * Create a widget for rendering the editor.
- *
- * @param int $userid
- * @param stdClass $grade
- * @param bool $readonly
- * @return assignfeedback_editpdf_widget
- */
- public function get_widget($userid, $grade, $readonly) {
- $attempt = -1;
- if ($grade && $grade->attemptnumber) {
- $attempt = $grade->attemptnumber;
- } else {
- $grade = $this->assignment->get_user_grade($userid, true);
- }
- $feedbackfile = document_services::get_feedback_document($this->assignment->get_instance()->id,
- $userid,
- $attempt);
- $stampfiles = array();
- $fs = get_file_storage();
- $syscontext = context_system::instance();
- // Copy any new stamps to this instance.
- if ($files = $fs->get_area_files($syscontext->id,
- 'assignfeedback_editpdf',
- 'stamps',
- 0,
- "filename",
- false)) {
- foreach ($files as $file) {
- $filename = $file->get_filename();
- if ($filename !== '.') {
- $existingfile = $fs->get_file($this->assignment->get_context()->id,
- 'assignfeedback_editpdf',
- 'stamps',
- $grade->id,
- '/',
- $file->get_filename());
- if (!$existingfile) {
- $newrecord = new stdClass();
- $newrecord->contextid = $this->assignment->get_context()->id;
- $newrecord->itemid = $grade->id;
- $fs->create_file_from_storedfile($newrecord, $file);
- }
- }
- }
- }
- // Now get the full list of stamp files for this instance.
- if ($files = $fs->get_area_files($this->assignment->get_context()->id,
- 'assignfeedback_editpdf',
- 'stamps',
- $grade->id,
- "filename",
- false)) {
- foreach ($files as $file) {
- $filename = $file->get_filename();
- if ($filename !== '.') {
- $url = moodle_url::make_pluginfile_url($this->assignment->get_context()->id,
- 'assignfeedback_editpdf',
- 'stamps',
- $grade->id,
- '/',
- $file->get_filename(),
- false);
- array_push($stampfiles, $url->out());
- }
- }
- }
- $url = false;
- $filename = '';
- if ($feedbackfile) {
- $url = moodle_url::make_pluginfile_url($this->assignment->get_context()->id,
- 'assignfeedback_editpdf',
- document_services::FINAL_PDF_FILEAREA,
- $grade->id,
- '/',
- $feedbackfile->get_filename(),
- false);
- $filename = $feedbackfile->get_filename();
- }
- // Retrieve total number of pages.
- $pagetotal = document_services::page_number_for_attempt($this->assignment->get_instance()->id,
- $userid,
- $attempt,
- $readonly);
- $widget = new assignfeedback_editpdf_widget($this->assignment->get_instance()->id,
- $userid,
- $attempt,
- $url,
- $filename,
- $stampfiles,
- $readonly,
- $pagetotal);
- return $widget;
- }
- /**
- * Get form elements for grading form
- *
- * @param stdClass $grade
- * @param MoodleQuickForm $mform
- * @param stdClass $data
- * @param int $userid
- * @return bool true if elements were added to the form
- */
- public function get_form_elements_for_user($grade, MoodleQuickForm $mform, stdClass $data, $userid) {
- global $PAGE;
- $attempt = -1;
- if ($grade) {
- $attempt = $grade->attemptnumber;
- }
- $files = document_services::list_compatible_submission_files_for_attempt($this->assignment, $userid, $attempt);
- // Only show the editor if there was a compatible file submitted.
- if (count($files)) {
- $renderer = $PAGE->get_renderer('assignfeedback_editpdf');
- $widget = $this->get_widget($userid, $grade, false);
- $html = $renderer->render($widget);
- $mform->addElement('static', 'editpdf', get_string('editpdf', 'assignfeedback_editpdf'), $html);
- $mform->addHelpButton('editpdf', 'editpdf', 'assignfeedback_editpdf');
- $mform->addElement('hidden', 'editpdf_source_userid', $userid);
- $mform->setType('editpdf_source_userid', PARAM_INT);
- $mform->setConstant('editpdf_source_userid', $userid);
- }
- }
- /**
- * Generate the pdf.
- *
- * @param stdClass $grade
- * @param stdClass $data
- * @return bool
- */
- public function save(stdClass $grade, stdClass $data) {
- // Source user id is only added to the form if there was a pdf.
- if (!empty($data->editpdf_source_userid)) {
- $sourceuserid = $data->editpdf_source_userid;
- // Copy drafts annotations and comments if current user is different to sourceuserid.
- if ($sourceuserid != $grade->userid) {
- page_editor::copy_drafts_from_to($this->assignment, $grade, $sourceuserid);
- }
- }
- if (page_editor::has_annotations_or_comments($grade->id, true)) {
- document_services::generate_feedback_document($this->assignment, $grade->userid, $grade->attemptnumber);
- }
- return true;
- }
- /**
- * Display the list of files in the feedback status table.
- *
- * @param stdClass $grade
- * @param bool $showviewlink (Always set to false).
- * @return string
- */
- public function view_summary(stdClass $grade, & $showviewlink) {
- $showviewlink = false;
- return $this->view($grade);
- }
- /**
- * Display the list of files in the feedback status table.
- *
- * @param stdClass $grade
- * @return string
- */
- public function view(stdClass $grade) {
- global $PAGE;
- $html = '';
- // Show a link to download the pdf.
- if (page_editor::has_annotations_or_comments($grade->id, false)) {
- $html = $this->assignment->render_area_files('assignfeedback_editpdf',
- document_services::FINAL_PDF_FILEAREA,
- $grade->id);
- // Also show the link to the read-only interface.
- $renderer = $PAGE->get_renderer('assignfeedback_editpdf');
- $widget = $this->get_widget($grade->userid, $grade, true);
- $html .= $renderer->render($widget);
- }
- return $html;
- }
- /**
- * Return true if there are no released comments/annotations.
- *
- * @param stdClass $grade
- */
- public function is_empty(stdClass $grade) {
- global $DB;
- $comments = $DB->count_records('assignfeedback_editpdf_cmnt', array('gradeid'=>$grade->id, 'draft'=>0));
- $annotations = $DB->count_records('assignfeedback_editpdf_annot', array('gradeid'=>$grade->id, 'draft'=>0));
- return $comments == 0 && $annotations == 0;
- }
- /**
- * The assignment has been deleted - remove the plugin specific data
- *
- * @return bool
- */
- public function delete_instance() {
- global $DB;
- $grades = $DB->get_records('assign_grades', array('assignment'=>$this->assignment->get_instance()->id), '', 'id');
- if ($grades) {
- list($gradeids, $params) = $DB->get_in_or_equal(array_keys($grades), SQL_PARAMS_NAMED);
- $DB->delete_records_select('assignfeedback_editpdf_annot', 'gradeid ' . $gradeids, $params);
- $DB->delete_records_select('assignfeedback_editpdf_cmnt', 'gradeid ' . $gradeids, $params);
- }
- return true;
- }
- /**
- * Automatically enable or disable editpdf feedback plugin based on
- * whether the ghostscript path is set correctly.
- *
- * @return bool
- */
- public function is_enabled() {
- if ($this->enabledcache === null) {
- $testpath = assignfeedback_editpdf\pdf::test_gs_path(false);
- $this->enabledcache = ($testpath->status == assignfeedback_editpdf\pdf::GSPATH_OK);
- }
- return $this->enabledcache;
- }
- /**
- * Automatically hide the setting for the editpdf feedback plugin.
- *
- * @return bool false
- */
- public function is_configurable() {
- return false;
- }
- }