6510353251548e91e4c8954a7fc56b0bc9ebabc1
[moodle.git] / mod / assign / feedback / comments / locallib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * This file contains the definition for the library class for comment feedback plugin
19  *
20  *
21  * @package   assignfeedback_comments
22  * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26  defined('MOODLE_INTERNAL') || die();
28 /**
29  * library class for comment feedback plugin extending feedback plugin base class
30  *
31  * @package   assignfeedback_comments
32  * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
33  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class assign_feedback_comments extends assign_feedback_plugin {
37    /**
38     * Get the name of the online comment feedback plugin
39     * @return string
40     */
41     public function get_name() {
42         return get_string('pluginname', 'assignfeedback_comments');
43     }
45     /**
46      * Get the feedback comment from the database
47      *
48      * @param int $gradeid
49      * @return stdClass|false The feedback comments for the given grade if it exists. False if it doesn't.
50      */
51     public function get_feedback_comments($gradeid) {
52         global $DB;
53         return $DB->get_record('assignfeedback_comments', array('grade'=>$gradeid));
54     }
56     /**
57      * Get quickgrading form elements as html
58      *
59      * @param int $userid The user id in the table this quickgrading element relates to
60      * @param mixed $grade - The grade data - may be null if there are no grades for this user (yet)
61      * @return mixed - A html string containing the html form elements required for quickgrading
62      */
63     public function get_quickgrading_html($userid, $grade) {
64         $commenttext = '';
65         if ($grade) {
66             $feedbackcomments = $this->get_feedback_comments($grade->id);
67             if ($feedbackcomments) {
68                 $commenttext = $feedbackcomments->commenttext;
69             }
70         }
72         return html_writer::tag('textarea', $commenttext, array('name'=>'quickgrade_comments_' . $userid,
73                                                                 'class'=>'quickgrade'));
74     }
76     /**
77      * Has the plugin quickgrading form element been modified in the current form submission?
78      *
79      * @param int $userid The user id in the table this quickgrading element relates to
80      * @param stdClass $grade The grade
81      * @return boolean - true if the quickgrading form element has been modified
82      */
83     public function is_quickgrading_modified($userid, $grade) {
84         $commenttext = '';
85         if ($grade) {
86             $feedbackcomments = $this->get_feedback_comments($grade->id);
87             if ($feedbackcomments) {
88                 $commenttext = $feedbackcomments->commenttext;
89             }
90         }
91         return optional_param('quickgrade_comments_' . $userid, '', PARAM_TEXT) != $commenttext;
92     }
95     /**
96      * Override to indicate a plugin supports quickgrading
97      *
98      * @return boolean - True if the plugin supports quickgrading
99      */
100     public function supports_quickgrading() {
101         return true;
102     }
104     /**
105      * Save quickgrading changes
106      *
107      * @param int $userid The user id in the table this quickgrading element relates to
108      * @param stdClass $grade The grade
109      * @return boolean - true if the grade changes were saved correctly
110      */
111     public function save_quickgrading_changes($userid, $grade) {
112         global $DB;
113         $feedbackcomment = $this->get_feedback_comments($grade->id);
114         if ($feedbackcomment) {
115             $feedbackcomment->commenttext = optional_param('quickgrade_comments_' . $userid, '', PARAM_TEXT);
116             return $DB->update_record('assignfeedback_comments', $feedbackcomment);
117         } else {
118             $feedbackcomment = new stdClass();
119             $feedbackcomment->commenttext = optional_param('quickgrade_comments_' . $userid, '', PARAM_TEXT);
120             $feedbackcomment->commentformat = FORMAT_HTML;
121             $feedbackcomment->grade = $grade->id;
122             $feedbackcomment->assignment = $this->assignment->get_instance()->id;
123             return $DB->insert_record('assignfeedback_comments', $feedbackcomment) > 0;
124         }
125     }
127     /**
128      * Get form elements for the grading page
129      *
130      * @param stdClass|null $grade
131      * @param MoodleQuickForm $mform
132      * @param stdClass $data
133      * @return bool true if elements were added to the form
134      */
135     public function get_form_elements($grade, MoodleQuickForm $mform, stdClass $data) {
136         if ($grade) {
137             $feedbackcomments = $this->get_feedback_comments($grade->id);
138             if ($feedbackcomments) {
139                 $data->assignfeedbackcomments_editor['text'] = $feedbackcomments->commenttext;
140                 $data->assignfeedbackcomments_editor['format'] = $feedbackcomments->commentformat;
141             }
142         }
144         $mform->addElement('editor', 'assignfeedbackcomments_editor', '', null, null);
145         return true;
146     }
148     /**
149      * Saving the comment content into dtabase
150      *
151      * @param stdClass $grade
152      * @param stdClass $data
153      * @return bool
154      */
155     public function save(stdClass $grade, stdClass $data) {
156         global $DB;
157         $feedbackcomment = $this->get_feedback_comments($grade->id);
158         if ($feedbackcomment) {
159             $feedbackcomment->commenttext = $data->assignfeedbackcomments_editor['text'];
160             $feedbackcomment->commentformat = $data->assignfeedbackcomments_editor['format'];
161             return $DB->update_record('assignfeedback_comments', $feedbackcomment);
162         } else {
163             $feedbackcomment = new stdClass();
164             $feedbackcomment->commenttext = $data->assignfeedbackcomments_editor['text'];
165             $feedbackcomment->commentformat = $data->assignfeedbackcomments_editor['format'];
166             $feedbackcomment->grade = $grade->id;
167             $feedbackcomment->assignment = $this->assignment->get_instance()->id;
168             return $DB->insert_record('assignfeedback_comments', $feedbackcomment) > 0;
169         }
170     }
172     /**
173      * display the comment in the feedback table
174      *
175      * @param stdClass $grade
176      * @param bool $showviewlink Set to true to show a link to view the full feedback
177      * @return string
178      */
179     public function view_summary(stdClass $grade, & $showviewlink) {
180         $feedbackcomments = $this->get_feedback_comments($grade->id);
181         if ($feedbackcomments) {
182             $text = format_text($feedbackcomments->commenttext, $feedbackcomments->commentformat, array('context' => $this->assignment->get_context()));
183             $short = shorten_text($text, 140);
185             // show the view all link if the text has been shortened
186             $showviewlink = $short != $text;
187             return $short;
188         }
189         return '';
190     }
192     /**
193      * display the comment in the feedback table
194      *
195      * @param stdClass $grade
196      * @return string
197      */
198     public function view(stdClass $grade) {
199         $feedbackcomments = $this->get_feedback_comments($grade->id);
200         if ($feedbackcomments) {
201             return format_text($feedbackcomments->commenttext, $feedbackcomments->commentformat, array('context' => $this->assignment->get_context()));
202         }
203         return '';
204     }
206     /**
207      * Return true if this plugin can upgrade an old Moodle 2.2 assignment of this type
208      * and version.
209      *
210      * @param string $type old assignment subtype
211      * @param int $version old assignment version
212      * @return bool True if upgrade is possible
213      */
214     public function can_upgrade($type, $version) {
216         if (($type == 'upload' || $type == 'uploadsingle' ||
217              $type == 'online' || $type == 'offline') && $version >= 2011112900) {
218             return true;
219         }
220         return false;
221     }
223     /**
224      * Upgrade the settings from the old assignment to the new plugin based one
225      *
226      * @param context $oldcontext - the context for the old assignment
227      * @param stdClass $oldassignment - the data for the old assignment
228      * @param string $log - can be appended to by the upgrade
229      * @return bool was it a success? (false will trigger a rollback)
230      */
231     public function upgrade_settings(context $oldcontext, stdClass $oldassignment, & $log) {
232         // first upgrade settings (nothing to do)
233         return true;
234     }
236     /**
237      * Upgrade the feedback from the old assignment to the new one
238      *
239      * @param context $oldcontext - the database for the old assignment context
240      * @param stdClass $oldassignment The data record for the old assignment
241      * @param stdClass $oldsubmission The data record for the old submission
242      * @param stdClass $grade The data record for the new grade
243      * @param string $log Record upgrade messages in the log
244      * @return bool true or false - false will trigger a rollback
245      */
246     public function upgrade(context $oldcontext, stdClass $oldassignment, stdClass $oldsubmission, stdClass $grade, & $log) {
247         global $DB;
249         $feedbackcomments = new stdClass();
250         $feedbackcomments->commenttext = $oldsubmission->submissioncomment;
251         $feedbackcomments->commentformat = FORMAT_HTML;
253         $feedbackcomments->grade = $grade->id;
254         $feedbackcomments->assignment = $this->assignment->get_instance()->id;
255         if (!$DB->insert_record('assignfeedback_comments', $feedbackcomments) > 0) {
256             $log .= get_string('couldnotconvertgrade', 'mod_assign', $grade->userid);
257             return false;
258         }
260         return true;
261     }
263     /**
264      * If this plugin adds to the gradebook comments field, it must specify the format of the text
265      * of the comment
266      *
267      * Only one feedback plugin can push comments to the gradebook and that is chosen by the assignment
268      * settings page.
269      *
270      * @param stdClass $grade The grade
271      * @return int
272      */
273     public function format_for_gradebook(stdClass $grade) {
274         $feedbackcomments = $this->get_feedback_comments($grade->id);
275         if ($feedbackcomments) {
276             return $feedbackcomments->commentformat;
277         }
278         return FORMAT_MOODLE;
279     }
281     /**
282      * If this plugin adds to the gradebook comments field, it must format the text
283      * of the comment
284      *
285      * Only one feedback plugin can push comments to the gradebook and that is chosen by the assignment
286      * settings page.
287      *
288      * @param stdClass $grade The grade
289      * @return string
290      */
291     public function text_for_gradebook(stdClass $grade) {
292         $feedbackcomments = $this->get_feedback_comments($grade->id);
293         if ($feedbackcomments) {
294             return $feedbackcomments->commenttext;
295         }
296         return '';
297     }
299     /**
300      * The assignment has been deleted - cleanup
301      *
302      * @return bool
303      */
304     public function delete_instance() {
305         global $DB;
306         // will throw exception on failure
307         $DB->delete_records('assignfeedback_comments', array('assignment'=>$this->assignment->get_instance()->id));
308         return true;
309     }
311     /**
312      * Returns true if there are no feedback comments for the given grade
313      *
314      * @param stdClass $grade
315      * @return bool
316      */
317     public function is_empty(stdClass $grade) {
318         return $this->view($grade) == '';
319     }