7d5b624ae6d990599dcf68d67752acd0cde20cb9
[moodle.git] / mod / assign / submission / onlinetext / 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 onlinetext submission plugin
19  *
20  * This class provides all the functionality for the new assign module.
21  *
22  * @package assignsubmission_onlinetext
23  * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
24  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die();
28 /**
29  * File area for online text submission assignment
30  */
31 define('ASSIGNSUBMISSION_ONLINETEXT_FILEAREA', 'submissions_onlinetext');
33 /**
34  * library class for onlinetext submission plugin extending submission plugin base class
35  *
36  * @package assignsubmission_onlinetext
37  * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
38  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class assign_submission_onlinetext extends assign_submission_plugin {
42     /**
43      * Get the name of the online text submission plugin
44      * @return string
45      */
46     public function get_name() {
47         return get_string('onlinetext', 'assignsubmission_onlinetext');
48     }
51    /**
52     * Get onlinetext submission information from the database
53     *
54     * @param  int $submissionid
55     * @return mixed
56     */
57     private function get_onlinetext_submission($submissionid) {
58         global $DB;
60         return $DB->get_record('assignsubmission_onlinetext', array('submission'=>$submissionid));
61     }
63     /**
64      * Add form elements for settings
65      *
66      * @param mixed $submission can be null
67      * @param MoodleQuickForm $mform
68      * @param stdClass $data
69      * @return true if elements were added to the form
70      */
71     public function get_form_elements($submission, MoodleQuickForm $mform, stdClass $data) {
72         $elements = array();
74         $editoroptions = $this->get_edit_options();
75         $submissionid = $submission ? $submission->id : 0;
77         if (!isset($data->onlinetext)) {
78             $data->onlinetext = '';
79         }
80         if (!isset($data->onlinetextformat)) {
81             $data->onlinetextformat = editors_get_preferred_format();
82         }
84         if ($submission) {
85             $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
86             if ($onlinetextsubmission) {
87                 $data->onlinetext = $onlinetextsubmission->onlinetext;
88                 $data->onlinetextformat = $onlinetextsubmission->onlineformat;
89             }
91         }
94         $data = file_prepare_standard_editor($data, 'onlinetext', $editoroptions, $this->assignment->get_context(), 'assignsubmission_onlinetext', ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $submissionid);
95         $mform->addElement('editor', 'onlinetext_editor', '', null, $editoroptions);
96         return true;
97     }
99     /**
100      * Editor format options
101      *
102      * @return array
103      */
104     private function get_edit_options() {
105          $editoroptions = array(
106            'noclean' => false,
107            'maxfiles' => EDITOR_UNLIMITED_FILES,
108            'maxbytes' => $this->assignment->get_course()->maxbytes,
109            'context' => $this->assignment->get_context(),
110            'return_types' => FILE_INTERNAL | FILE_EXTERNAL
111         );
112         return $editoroptions;
113     }
115      /**
116       * Save data to the database
117       *
118       * @param stdClass $submission
119       * @param stdClass $data
120       * @return bool
121       */
122      public function save(stdClass $submission, stdClass $data) {
123         global $DB;
125         $editoroptions = $this->get_edit_options();
127         $data = file_postupdate_standard_editor($data, 'onlinetext', $editoroptions, $this->assignment->get_context(), 'assignsubmission_onlinetext', ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $submission->id);
129         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
130         if ($onlinetextsubmission) {
132             $onlinetextsubmission->onlinetext = $data->onlinetext;
133             $onlinetextsubmission->onlineformat = $data->onlinetext_editor['format'];
136             return $DB->update_record('assignsubmission_onlinetext', $onlinetextsubmission);
137         } else {
139             $onlinetextsubmission = new stdClass();
140             $onlinetextsubmission->onlinetext = $data->onlinetext;
141             $onlinetextsubmission->onlineformat = $data->onlinetext_editor['format'];
143             $onlinetextsubmission->submission = $submission->id;
144             $onlinetextsubmission->assignment = $this->assignment->get_instance()->id;
145             return $DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission) > 0;
146         }
149     }
151     /**
152      * Get the saved text content from the editor
153      *
154      * @param string $name
155      * @param int $submissionid
156      * @return string
157      */
158     public function get_editor_text($name, $submissionid) {
159         if ($name == 'onlinetext') {
160             $onlinetextsubmission = $this->get_onlinetext_submission($submissionid);
161             if ($onlinetextsubmission) {
162                 return $onlinetextsubmission->onlinetext;
163             }
164         }
166         return '';
167     }
169     /**
170      * Get the content format for the editor
171      *
172      * @param string $name
173      * @param int $submissionid
174      * @return int
175      */
176     public function get_editor_format($name, $submissionid) {
177         if ($name == 'onlinetext') {
178             $onlinetextsubmission = $this->get_onlinetext_submission($submissionid);
179             if ($onlinetextsubmission) {
180                 return $onlinetextsubmission->onlineformat;
181             }
182         }
185          return 0;
186     }
189      /**
190       * Display onlinetext word count in the submission status table
191       *
192       * @param stdClass $submission
193       * @param bool $showviewlink - If the summary has been truncated set this to true
194       * @return string
195       */
196     public function view_summary(stdClass $submission, & $showviewlink) {
198         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
199         // always show the view link
200         $showviewlink = true;
202         if ($onlinetextsubmission) {
203             $text = $this->assignment->render_editor_content(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
204                                                              $onlinetextsubmission->submission,
205                                                              $this->get_type(),
206                                                              'onlinetext',
207                                                              'assignsubmission_onlinetext');
209             $shorttext = shorten_text($text, 140);
210             if ($text != $shorttext) {
211                 return $shorttext . get_string('numwords', 'assignsubmission_onlinetext', count_words($text));
212             } else {
213                 return $shorttext;
214             }
215         }
216         return '';
217     }
219     /**
220      * Produce a list of files suitable for export that represent this submission
221      *
222      * @param stdClass $submission - For this is the submission data
223      * @return array - return an array of files indexed by filename
224      */
225     public function get_files(stdClass $submission) {
226         global $DB;
227         $files = array();
228         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
229         if ($onlinetextsubmission) {
230             $user = $DB->get_record("user", array("id"=>$submission->userid),'id,username,firstname,lastname', MUST_EXIST);
232             $prefix = clean_filename(fullname($user) . "_" .$submission->userid . "_");
233             $finaltext = str_replace('@@PLUGINFILE@@/', $prefix, $onlinetextsubmission->onlinetext);
234             $submissioncontent = "<html><body>". format_text($finaltext, $onlinetextsubmission->onlineformat, array('context'=>$this->assignment->get_context())). "</body></html>";      //fetched from database
236             $files[get_string('onlinetextfilename', 'assignsubmission_onlinetext')] = array($submissioncontent);
238             $fs = get_file_storage();
240             $fsfiles = $fs->get_area_files($this->assignment->get_context()->id, 'assignsubmission_onlinetext', ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $submission->id, "timemodified", false);
242             foreach ($fsfiles as $file) {
243                 $files[$file->get_filename()] = $file;
244             }
245         }
247         return $files;
248     }
250     /**
251      * Display the saved text content from the editor in the view table
252      *
253      * @param stdClass $submission
254      * @return string
255      */
256     public function view(stdClass $submission) {
257         $result = '';
259         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
262         if ($onlinetextsubmission) {
264             // render for portfolio API
265             $result .= $this->assignment->render_editor_content(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $onlinetextsubmission->submission, $this->get_type(), 'onlinetext', 'assignsubmission_onlinetext');
267         }
269         return $result;
270     }
272      /**
273      * Return true if this plugin can upgrade an old Moodle 2.2 assignment of this type and version.
274      *
275      * @param string $type old assignment subtype
276      * @param int $version old assignment version
277      * @return bool True if upgrade is possible
278      */
279     public function can_upgrade($type, $version) {
280         if ($type == 'online' && $version >= 2011112900) {
281             return true;
282         }
283         return false;
284     }
287     /**
288      * Upgrade the settings from the old assignment to the new plugin based one
289      *
290      * @param context $oldcontext - the database for the old assignment context
291      * @param stdClass $oldassignment - the database for the old assignment instance
292      * @param string $log record log events here
293      * @return bool Was it a success?
294      */
295     public function upgrade_settings(context $oldcontext, stdClass $oldassignment, & $log) {
296         // first upgrade settings (nothing to do)
297         return true;
298     }
300     /**
301      * Upgrade the submission from the old assignment to the new one
302      *
303      * @param context $oldcontext - the database for the old assignment context
304      * @param stdClass $oldassignment The data record for the old assignment
305      * @param stdClass $oldsubmission The data record for the old submission
306      * @param stdClass $submission The data record for the new submission
307      * @param string $log Record upgrade messages in the log
308      * @return bool true or false - false will trigger a rollback
309      */
310     public function upgrade(context $oldcontext, stdClass $oldassignment, stdClass $oldsubmission, stdClass $submission, & $log) {
311         global $DB;
313         $onlinetextsubmission = new stdClass();
314         $onlinetextsubmission->onlinetext = $oldsubmission->data1;
315         $onlinetextsubmission->onlineformat = $oldsubmission->data2;
317         $onlinetextsubmission->submission = $submission->id;
318         $onlinetextsubmission->assignment = $this->assignment->get_instance()->id;
320         if ($onlinetextsubmission->onlinetext === null) {
321             $onlinetextsubmission->onlinetext = '';
322         }
324         if ($onlinetextsubmission->onlineformat === null) {
325             $onlinetextsubmission->onlineformat = editors_get_preferred_format();
326         }
328         if (!$DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission) > 0) {
329             $log .= get_string('couldnotconvertsubmission', 'mod_assign', $submission->userid);
330             return false;
331         }
333         // now copy the area files
334         $this->assignment->copy_area_files_for_upgrade($oldcontext->id,
335                                                         'mod_assignment',
336                                                         'submission',
337                                                         $oldsubmission->id,
338                                                         // New file area
339                                                         $this->assignment->get_context()->id,
340                                                         'assignsubmission_onlinetext',
341                                                         ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
342                                                         $submission->id);
343         return true;
344     }
346     /**
347      * Formatting for log info
348      *
349      * @param stdClass $submission The new submission
350      * @return string
351      */
352     public function format_for_log(stdClass $submission) {
353         // format the info for each submission plugin add_to_log
354         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
355         $onlinetextloginfo = '';
356         $text = format_text($onlinetextsubmission->onlinetext,
357                             $onlinetextsubmission->onlineformat,
358                             array('context'=>$this->assignment->get_context()));
359         $onlinetextloginfo .= get_string('numwordsforlog', 'assignsubmission_onlinetext', count_words($text));
361         return $onlinetextloginfo;
362     }
364     /**
365      * The assignment has been deleted - cleanup
366      *
367      * @return bool
368      */
369     public function delete_instance() {
370         global $DB;
371         // will throw exception on failure
372         $DB->delete_records('assignsubmission_onlinetext', array('assignment'=>$this->assignment->get_instance()->id));
374         return true;
375     }
377     /**
378      * No text is set for this plugin
379      *
380      * @param stdClass $submission
381      * @return bool
382      */
383     public function is_empty(stdClass $submission) {
384         $onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
386         return empty($onlinetextsubmission->onlinetext);
387     }
389     /**
390      * Get file areas returns a list of areas this plugin stores files
391      * @return array - An array of fileareas (keys) and descriptions (values)
392      */
393     public function get_file_areas() {
394         return array(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA=>$this->get_name());
395     }