assignment MDL-19803 Converted deprecated calendar functions
[moodle.git] / mod / assignment / type / online / assignment.class.php
CommitLineData
e7521559 1<?php
6cb1b93e 2require_once($CFG->libdir.'/formslib.php');
67a87e7d 3require_once($CFG->dirroot . '/mod/assignment/lib.php');
f77cfb73 4/**
5 * Extend the base assignment class for assignments where you upload a single file
6 *
7 */
8class assignment_online extends assignment_base {
9
7bddd4b7 10 function assignment_online($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) {
11 parent::assignment_base($cmid, $assignment, $cm, $course);
0b5a80a1 12 $this->type = 'online';
f77cfb73 13 }
14
f77cfb73 15 function view() {
16
01e0da58 17 global $USER, $OUTPUT;
6cb1b93e 18
19 $edit = optional_param('edit', 0, PARAM_BOOL);
20 $saved = optional_param('saved', 0, PARAM_BOOL);
21
22 $context = get_context_instance(CONTEXT_MODULE, $this->cm->id);
0468976c 23 require_capability('mod/assignment:view', $context);
6cb1b93e 24
61240489 25 $submission = $this->get_submission();
1648afb2 26
2eac7ec1 27 //Guest can not submit nor edit an assignment (bug: 4604)
be07f21b 28 if (!has_capability('mod/assignment:submit', $context)) {
2eac7ec1 29 $editable = null;
6cb1b93e 30 } else {
2eac7ec1 31 $editable = $this->isopen() && (!$submission || $this->assignment->resubmit || !$submission->timemarked);
32 }
6cb1b93e 33 $editmode = ($editable and $edit);
f77cfb73 34
35 if ($editmode) {
f7de5478 36 //guest can not edit or submit assignment
be07f21b 37 if (!has_capability('mod/assignment:submit', $context)) {
cb59ca28 38 print_error('guestnosubmit', 'assignment');
f7de5478 39 }
f77cfb73 40 }
41
cb59ca28 42 add_to_log($this->course->id, "assignment", "view", "view.php?id={$this->cm->id}", $this->assignment->id, $this->cm->id);
43
6cb1b93e 44/// prepare form and process submitted data
1d284fbd 45 $mform = new mod_assignment_online_edit_form();
f77cfb73 46
6cb1b93e 47 $defaults = new object();
48 $defaults->id = $this->cm->id;
49 if (!empty($submission)) {
50 if ($this->usehtmleditor) {
51 $options = new object();
52 $options->smiley = false;
53 $options->filter = false;
f77cfb73 54
6cb1b93e 55 $defaults->text = format_text($submission->data1, $submission->data2, $options);
56 $defaults->format = FORMAT_HTML;
57 } else {
58 $defaults->text = $submission->data1;
59 $defaults->format = $submission->data2;
60 }
61 }
beac4717 62 $mform->set_data($defaults);
6cb1b93e 63
5571b5f4 64 if ($mform->is_cancelled()) {
65 redirect('view.php?id='.$this->cm->id);
66 }
67
beac4717 68 if ($data = $mform->get_data()) { // No incoming data?
f0a99707 69 if ($editable && $this->update_submission($data)) {
ca4fb814 70 //TODO fix log actions - needs db upgrade
418db328 71 $submission = $this->get_submission();
6cb1b93e 72 add_to_log($this->course->id, 'assignment', 'upload',
9bf660b3 73 'view.php?a='.$this->assignment->id, $this->assignment->id, $this->cm->id);
74 $this->email_teachers($submission);
3e7bf58a 75 //redirect to get updated submission date and word count
76 redirect('view.php?id='.$this->cm->id.'&saved=1');
f0a99707 77 } else {
78 // TODO: add better error message
3a003ead 79 echo $OUTPUT->notification(get_string("error")); //submitting not allowed!
f77cfb73 80 }
6cb1b93e 81 }
82
83/// print header, etc. and display form if needed
84 if ($editmode) {
85 $this->view_header(get_string('editmysubmission', 'assignment'));
86 } else {
87 $this->view_header();
88 }
89
90 $this->view_intro();
91
92 $this->view_dates();
93
94 if ($saved) {
3a003ead 95 echo $OUTPUT->notification(get_string('submissionsaved', 'assignment'), 'notifysuccess');
3e7bf58a 96 }
f77cfb73 97
61240489 98 if (has_capability('mod/assignment:submit', $context)) {
61240489 99 if ($editmode) {
01e0da58 100 echo $OUTPUT->box_start('generalbox', 'online');
6cb1b93e 101 $mform->display();
61240489 102 } else {
01e0da58 103 echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter', 'online');
728e1931 104 if ($submission && has_capability('mod/assignment:exportownsubmission', $this->context)) {
61240489 105 echo format_text($submission->data1, $submission->data2);
0d06b6fd 106 $button = new portfolio_add_button();
107 $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id), '/mod/assignment/lib.php');
108 $button->render();
61240489 109 } else if (!has_capability('mod/assignment:submit', $context)) { //fix for #4604
d9cb14b8 110 echo '<div style="text-align:center">'. get_string('guestnosubmit', 'assignment').'</div>';
61240489 111 } else if ($this->isopen()){ //fix for #4206
d9cb14b8 112 echo '<div style="text-align:center">'.get_string('emptysubmission', 'assignment').'</div>';
61240489 113 }
61240489 114 }
01e0da58 115 echo $OUTPUT->box_end();
12dce253 116 if (!$editmode && $editable) {
117 echo "<div style='text-align:center'>";
75d47fa9 118 echo $OUTPUT->button(html_form::make_button('view.php', array('id'=>$this->cm->id,'edit'=>'1'),
119 get_string('editmysubmission', 'assignment')));
12dce253 120 echo "</div>";
121 }
6cb1b93e 122
61240489 123 }
f77cfb73 124
125 $this->view_feedback();
126
127 $this->view_footer();
128 }
129
3e7bf58a 130 /*
131 * Display the assignment dates
132 */
133 function view_dates() {
3a003ead 134 global $USER, $CFG, $OUTPUT;
3e7bf58a 135
136 if (!$this->assignment->timeavailable && !$this->assignment->timedue) {
137 return;
138 }
139
3a003ead 140 echo $OUTPUT->box_start('generalbox boxaligncenter', 'dates');
3e7bf58a 141 echo '<table>';
142 if ($this->assignment->timeavailable) {
143 echo '<tr><td class="c0">'.get_string('availabledate','assignment').':</td>';
144 echo ' <td class="c1">'.userdate($this->assignment->timeavailable).'</td></tr>';
145 }
146 if ($this->assignment->timedue) {
147 echo '<tr><td class="c0">'.get_string('duedate','assignment').':</td>';
148 echo ' <td class="c1">'.userdate($this->assignment->timedue).'</td></tr>';
149 }
150 $submission = $this->get_submission($USER->id);
151 if ($submission) {
152 echo '<tr><td class="c0">'.get_string('lastedited').':</td>';
153 echo ' <td class="c1">'.userdate($submission->timemodified);
1884f2a6 154 /// Decide what to count
155 if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_WORDS) {
156 echo ' ('.get_string('numwords', '', count_words(format_text($submission->data1, $submission->data2))).')</td></tr>';
157 } else if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_LETTERS) {
158 echo ' ('.get_string('numletters', '', count_letters(format_text($submission->data1, $submission->data2))).')</td></tr>';
159 }
3e7bf58a 160 }
161 echo '</table>';
3a003ead 162 echo $OUTPUT->box_end();
3e7bf58a 163 }
164
f77cfb73 165 function update_submission($data) {
74d7d735 166 global $CFG, $USER, $DB;
f77cfb73 167
168 $submission = $this->get_submission($USER->id, true);
169
6cb1b93e 170 $update = new object();
171 $update->id = $submission->id;
172 $update->data1 = $data->text;
173 $update->data2 = $data->format;
0cbc1f11 174 $update->timemodified = time();
f77cfb73 175
9d749339 176 $DB->update_record('assignment_submissions', $update);
12dce253 177
178 $submission = $this->get_submission($USER->id);
179 $this->update_grade($submission);
180 return true;
f77cfb73 181 }
182
183
9bf660b3 184 function print_student_answer($userid, $return=false){
f2a1963c 185 global $OUTPUT;
9bf660b3 186 if (!$submission = $this->get_submission($userid)) {
187 return '';
188 }
e7521559 189
47c96a77 190 $link = html_link::make("/mod/assignment/type/online/file.php?id={$this->cm->id}&userid={$submission->userid}", shorten_text(trim(strip_tags(format_text($submission->data1,$submission->data2))), 15));
a9573c08 191 $link->add_action(new popup_action('click', $link->url, 'file'.$userid, array('height' => 450, 'width' => 580)));
192 $link->title = get_string('submission', 'assignment');
e7521559
PS
193 $popup = $OUTPUT->link($link);
194
9bf660b3 195 $output = '<div class="files">'.
f2a1963c 196 '<img src="'.$OUTPUT->old_icon_url('f/html') . '" class="icon" alt="html" />'.
a9573c08 197 $popup .
9bf660b3 198 '</div>';
199 return $output;
200 }
6cb1b93e 201
f77cfb73 202 function print_user_files($userid, $return=false) {
47c96a77 203 global $OUTPUT, $CFG;
6cb1b93e 204
f77cfb73 205 if (!$submission = $this->get_submission($userid)) {
206 return '';
207 }
e7521559 208
47c96a77 209 $link = html_link::make("/mod/assignment/type/online/file.php?id={$this->cm->id}&userid={$submission->userid}", shorten_text(trim(strip_tags(format_text($submission->data1,$submission->data2))), 15));
a9573c08 210 $link->add_action(new popup_action('click', $link->url, 'file'.$userid, array('height' => 450, 'width' => 580)));
211 $link->title = get_string('submission', 'assignment');
e7521559 212 $popup = $OUTPUT->link($link);
6cb1b93e 213
f77cfb73 214 $output = '<div class="files">'.
f2a1963c 215 '<img align="middle" src="'.$OUTPUT->old_icon_url('f/html') . '" height="16" width="16" alt="html" />'.
a9573c08 216 $popup .
f77cfb73 217 '</div>';
218
9bf660b3 219 ///Stolen code from file.php
6cb1b93e 220
3a003ead 221 echo $OUTPUT->box_start('generalbox boxaligncenter', 'wordcount');
63d69d54 222 /// Decide what to count
223 if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_WORDS) {
224 echo ' ('.get_string('numwords', '', count_words(format_text($submission->data1, $submission->data2))).')';
225 } else if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_LETTERS) {
226 echo ' ('.get_string('numletters', '', count_letters(format_text($submission->data1, $submission->data2))).')';
227 }
3a003ead 228 echo $OUTPUT->box_end();
229 echo $OUTPUT->box(format_text($submission->data1, $submission->data2), 'generalbox boxaligncenter boxwidthwide');
6cb1b93e 230
9bf660b3 231 ///End of stolen code from file.php
6cb1b93e 232
f77cfb73 233 if ($return) {
9bf660b3 234 //return $output;
f77cfb73 235 }
9bf660b3 236 //echo $output;
f77cfb73 237 }
238
01e2fdfe 239 function preprocess_submission(&$submission) {
ea6432fe 240 if ($this->assignment->var1 && empty($submission->submissioncomment)) { // comment inline
47263937 241 if ($this->usehtmleditor) {
242 // Convert to html, clean & copy student data to teacher
ea6432fe 243 $submission->submissioncomment = format_text($submission->data1, $submission->data2);
6cb1b93e 244 $submission->format = FORMAT_HTML;
47263937 245 } else {
246 // Copy student data to teacher
ea6432fe 247 $submission->submissioncomment = $submission->data1;
6cb1b93e 248 $submission->format = $submission->data2;
47263937 249 }
01e2fdfe 250 }
251 }
252
436cfa9f 253 function setup_elements(&$mform) {
254 global $CFG, $COURSE;
255
256 $ynoptions = array( 0 => get_string('no'), 1 => get_string('yes'));
257
258 $mform->addElement('select', 'resubmit', get_string("allowresubmit", "assignment"), $ynoptions);
259 $mform->setHelpButton('resubmit', array('resubmit', get_string('allowresubmit', 'assignment'), 'assignment'));
260 $mform->setDefault('resubmit', 0);
261
262 $mform->addElement('select', 'emailteachers', get_string("emailteachers", "assignment"), $ynoptions);
263 $mform->setHelpButton('emailteachers', array('emailteachers', get_string('emailteachers', 'assignment'), 'assignment'));
264 $mform->setDefault('emailteachers', 0);
265
266 $mform->addElement('select', 'var1', get_string("commentinline", "assignment"), $ynoptions);
267 $mform->setHelpButton('var1', array('commentinline', get_string('commentinline', 'assignment'), 'assignment'));
268 $mform->setDefault('var1', 0);
269
270 }
271
67a87e7d 272 function portfolio_exportable() {
273 return true;
274 }
ffcfd8a7 275
eb32c6ca 276 function portfolio_get_sha1($userid=0) {
277 $submission = $this->get_submission($userid);
ffcfd8a7 278 return sha1(format_text($submission->data1, $submission->data2));
279 }
280
eb32c6ca 281 function portfolio_prepare_package($exporter, $userid=0) {
282 $submission = $this->get_submission($userid);
6be1dcae 283 $exporter->write_new_file(format_text($submission->data1, $submission->data2), 'assignment.html', false);
ffcfd8a7 284 }
ea0de12f 285
286 function portfolio_supported_formats() {
6be1dcae 287 return array(PORTFOLIO_FORMAT_PLAINHTML);
ea0de12f 288 }
47c96a77 289
290 function extend_settings_navigation($node) {
291 global $PAGE, $CFG, $USER;
292
293 // get users submission if there is one
294 $submission = $this->get_submission();
295 if (has_capability('mod/assignment:submit', $PAGE->cm->context)) {
296 $editable = $this->isopen() && (!$submission || $this->assignment->resubmit || !$submission->timemarked);
297 } else {
298 $editable = false;
299 }
300
301 // If the user has submitted something add a bit more stuff
302 if ($submission) {
303 // Add a view link to the settings nav
304 $link = new moodle_url($CFG->wwwroot.'/mod/assignment/view.php', array('id'=>$PAGE->cm->id));
305 $node->add(get_string('viewmysubmission', 'assignment'), $link, navigation_node::TYPE_SETTING);
306
307 if (!empty($submission->timemodified)) {
308 $key = $node->add(get_string('submitted', 'assignment') . ' ' . userdate($submission->timemodified));
309 $node->get($key)->text = preg_replace('#([^,])\s#', '$1&nbsp;', $node->get($key)->text);
310 $node->get($key)->add_class('note');
311 if ($submission->timemodified <= $this->assignment->timedue || empty($this->assignment->timedue)) {
312 $node->get($key)->add_class('early');
313 } else {
314 $node->get($key)->add_class('late');
315 }
316 }
317 }
318
319 if (!$submission || $editable) {
320 // If this assignment is editable once submitted add an edit link to the settings nav
321 $link = new moodle_url($CFG->wwwroot.'/mod/assignment/view.php', array('id'=>$PAGE->cm->id, 'edit'=>1, 'sesskey'=>sesskey()));
322 $node->add(get_string('editmysubmission', 'assignment'), $link, navigation_node::TYPE_SETTING);
323 }
324 }
f77cfb73 325}
326
f07b9627 327class mod_assignment_online_edit_form extends moodleform {
6cb1b93e 328 function definition() {
329 $mform =& $this->_form;
330
331 // visible elements
9da321f7 332 $mform->addElement('htmleditor', 'text', get_string('submission', 'assignment'), array('cols'=>60, 'rows'=>30));
6117edc7 333 $mform->setType('text', PARAM_RAW); // to be cleaned before display
16851b22 334 $mform->setHelpButton('text', array('reading', 'writing', 'richtext2'), false, 'editorhelpbutton');
44d6ecc3 335 $mform->addRule('text', get_string('required'), 'required', null, 'client');
6cb1b93e 336
337 $mform->addElement('format', 'format', get_string('format'));
338 $mform->setHelpButton('format', array('textformat', get_string('helpformatting')));
339
6117edc7 340 // hidden params
6cb1b93e 341 $mform->addElement('hidden', 'id', 0);
342 $mform->setType('id', PARAM_INT);
343
344 // buttons
a23f0aaf 345 $this->add_action_buttons();
6cb1b93e 346 }
347}
348
e7521559 349