diff --git a/mod/assignment/db/upgrade.php b/mod/assignment/db/upgrade.php index dc2bfc083b0..a3995d3541b 100644 --- a/mod/assignment/db/upgrade.php +++ b/mod/assignment/db/upgrade.php @@ -68,15 +68,18 @@ function xmldb_assignment_upgrade($oldversion) { $context = get_context_instance(CONTEXT_MODULE, $submission->cmid); // migrate submitted files first - $path = $basepath; + $newpath = "$CFG->dataroot/$submission->course/$CFG->moddata/assignment/$submission->assignment/$submission->id/"; + if (!file_exists($newpath)) { + mkdir($newpath); + } $filearea = 'assignment_submission'; - $items = new DirectoryIterator($path); + $items = new DirectoryIterator($basepath); foreach ($items as $item) { if (!$item->isFile()) { continue; } if (!$item->isReadable()) { - echo $OUTPUT->notification(" File not readable, skipping: ".$path.$item->getFilename()); + echo $OUTPUT->notification(" File not readable, skipping: ".$basepath.$item->getFilename()); continue; } $filename = clean_param($item->getFilename(), PARAM_FILE); @@ -84,19 +87,20 @@ function xmldb_assignment_upgrade($oldversion) { continue; } if (!$fs->file_exists($context->id, $filearea, $submission->userid, '/', $filename)) { - $file_record = array('contextid'=>$context->id, 'filearea'=>$filearea, 'itemid'=>$submission->userid, 'filepath'=>'/', 'filename'=>$filename, 'userid'=>$submission->userid); - if ($fs->create_file_from_pathname($file_record, $path.$item->getFilename())) { - unlink($path.$item->getFilename()); + $file_record = array('contextid'=>$context->id, 'filearea'=>$filearea, 'itemid'=>$submission->id, 'filepath'=>'/', 'filename'=>$filename, 'userid'=>$submission->userid); + if ($fs->create_file_from_pathname($file_record, $basepath.$item->getFilename())) { + unlink($basepath.$item->getFilename()); } } } unset($items); //release file handles // migrate teacher response files - $path = $basepath.'responses/'; - if (file_exists($path)) { + $basepath = $basepath.'responses/'; + $newpath = $newpath.'responses/'; + if (file_exists($basepath)) { $filearea = 'assignment_response'; - $items = new DirectoryIterator($path); + $items = new DirectoryIterator($basepath); foreach ($items as $item) { if (!$item->isFile()) { continue; @@ -106,13 +110,13 @@ function xmldb_assignment_upgrade($oldversion) { continue; } if (!$fs->file_exists($context->id, $filearea, $submission->userid, '/', $filename)) { - $file_record = array('contextid'=>$context->id, 'filearea'=>$filearea, 'itemid'=>$submission->userid, 'filepath'=>'/', 'filename'=>$filename, + $file_record = array('contextid'=>$context->id, 'filearea'=>$filearea, 'itemid'=>$submission->id, 'filepath'=>'/', 'filename'=>$filename, 'timecreated'=>$item->getCTime(), 'timemodified'=>$item->getMTime()); if ($submission->teacher) { $file_record['userid'] = $submission->teacher; } - if ($fs->create_file_from_pathname($file_record, $path.$item->getFilename())) { - unlink($path.$item->getFilename()); + if ($fs->create_file_from_pathname($file_record, $basepath.$item->getFilename())) { + unlink($basepath.$item->getFilename()); } } } diff --git a/mod/assignment/type/upload/assignment.class.php b/mod/assignment/type/upload/assignment.class.php index 108afe5a0a6..b9408548fb7 100644 --- a/mod/assignment/type/upload/assignment.class.php +++ b/mod/assignment/type/upload/assignment.class.php @@ -38,8 +38,8 @@ class assignment_upload extends assignment_base { $this->view_dates(); if (has_capability('mod/assignment:submit', $this->context)) { - $filecount = $this->count_user_files($USER->id); $submission = $this->get_submission($USER->id); + $filecount = $this->count_user_files($submission->id); $this->view_feedback(); @@ -344,16 +344,16 @@ class assignment_upload extends assignment_base { $fs = get_file_storage(); $browser = get_file_browser(); - if ($files = $fs->get_area_files($this->context->id, 'assignment_submission', $userid, "timemodified", false)) { + if ($files = $fs->get_area_files($this->context->id, 'assignment_submission', $submission->id, "timemodified", false)) { $button = new portfolio_add_button(); foreach ($files as $file) { $filename = $file->get_filename(); $mimetype = $file->get_mimetype(); - $path = file_encode_url($CFG->wwwroot.'/pluginfile.php', '/'.$this->context->id.'/assignment_submission/'.$userid.'/'.$filename); + $path = file_encode_url($CFG->wwwroot.'/pluginfile.php', '/'.$this->context->id.'/assignment_submission/'.$submission->id.'/'.$filename); $output .= ''.$mimetype.''.s($filename).''; if ($candelete) { - $delurl = "$CFG->wwwroot/mod/assignment/delete.php?id={$this->cm->id}&file=".rawurlencode($filename)."&userid={$submission->userid}&mode=$mode&offset=$offset"; + $delurl = "$CFG->wwwroot/mod/assignment/delete.php?id={$this->cm->id}&file=".rawurlencode($filename)."&userid=$userid&submissionid={$submission->id}&mode=$mode&offset=$offset"; $output .= ' ' .' '; @@ -575,11 +575,13 @@ class assignment_upload extends assignment_base { $fs = get_file_storage(); $filename = $mform->get_new_filename('newfile'); if ($filename !== false) { - if (!$fs->file_exists($this->context->id, 'assignment_submission', $USER->id, '/', $filename)) { - if ($file = $mform->save_stored_file('newfile', $this->context->id, 'assignment_submission', $USER->id, '/', $filename, false, $USER->id)) { $submission = $this->get_submission($USER->id, true); //create new submission if needed - $submission->timemodified = time(); - if ($DB->update_record('assignment_submissions', $submission)) { + if (!$fs->file_exists($this->context->id, 'assignment_submission', $submission->id, '/', $filename)) { + if ($file = $mform->save_stored_file('newfile', $this->context->id, 'assignment_submission', $submission->id, '/', $filename, false, $USER->id)) { + $updates = new object(); + $updates->id = $submission->id; + $updates->timemodified = time(); + if ($DB->update_record('assignment_submissions', $updates)) { add_to_log($this->course->id, 'assignment', 'upload', 'view.php?a='.$this->assignment->id, $this->assignment->id, $this->cm->id); $this->update_grade($submission); @@ -823,6 +825,7 @@ class assignment_upload extends assignment_base { $file = required_param('file', PARAM_FILE); $userid = required_param('userid', PARAM_INT); + $submissionid = required_param('submissionid', PARAM_INT); $confirm = optional_param('confirm', 0, PARAM_BOOL); $mode = optional_param('mode', '', PARAM_ALPHA); $offset = optional_param('offset', 0, PARAM_INT); @@ -849,7 +852,7 @@ class assignment_upload extends assignment_base { } if (!data_submitted() or !$confirm or !confirm_sesskey()) { - $optionsyes = array ('id'=>$this->cm->id, 'file'=>$file, 'userid'=>$userid, 'confirm'=>1, 'sesskey'=>sesskey(), 'mode'=>$mode, 'offset'=>$offset, 'sesskey'=>sesskey()); + $optionsyes = array ('id'=>$this->cm->id, 'file'=>$file, 'userid'=>$userid, 'submissionid'=>$submissionid, 'confirm'=>1, 'sesskey'=>sesskey(), 'mode'=>$mode, 'offset'=>$offset, 'sesskey'=>sesskey()); if (empty($mode)) { $this->view_header(get_string('delete')); } else { @@ -867,7 +870,7 @@ class assignment_upload extends assignment_base { } $fs = get_file_storage(); - if ($file = $fs->get_file($this->context->id, 'assignment_submission', $userid, '/', $file)) { + if ($file = $fs->get_file($this->context->id, 'assignment_submission', $submissionid, '/', $file)) { if ($file->delete()) { $submission->timemodified = time(); if ($DB->update_record('assignment_submissions', $submission)) { diff --git a/mod/assignment/type/uploadsingle/assignment.class.php b/mod/assignment/type/uploadsingle/assignment.class.php index e8edd88fda9..321c43939db 100644 --- a/mod/assignment/type/uploadsingle/assignment.class.php +++ b/mod/assignment/type/uploadsingle/assignment.class.php @@ -50,14 +50,15 @@ class assignment_uploadsingle extends assignment_base { $this->view_dates(); - $filecount = $this->count_user_files($USER->id); + $filecount = false; - if ($submission = $this->get_submission()) { + if ($submission = $this->get_submission($USER->id)) { + $filecount = $this->count_user_files($submission->id); if ($submission->timemarked) { $this->view_feedback(); } if ($filecount) { - echo $OUTPUT->box($this->print_user_files($USER->id, true), 'generalbox boxaligncenter'); + echo $OUTPUT->box($this->print_user_files($submission->id, true), 'generalbox boxaligncenter'); } } @@ -82,15 +83,13 @@ class assignment_uploadsingle extends assignment_base { require_capability('mod/assignment:submit', get_context_instance(CONTEXT_MODULE, $this->cm->id)); - $this->view_header(get_string('upload')); - $filecount = $this->count_user_files($USER->id); $submission = $this->get_submission($USER->id); if ($this->isopen() && (!$filecount || $this->assignment->resubmit || !$submission->timemarked)) { if ($submission = $this->get_submission($USER->id)) { //TODO: change later to ">= 0", to prevent resubmission when graded 0 if (($submission->grade > 0) and !$this->assignment->resubmit) { - echo $OUTPUT->notification(get_string('alreadygraded', 'assignment')); + redirect('view.php?id='.$this->cm->id, get_string('alreadygraded', 'assignment')); } } @@ -99,17 +98,22 @@ class assignment_uploadsingle extends assignment_base { $fs = get_file_storage(); $filename = $mform->get_new_filename('newfile'); if ($filename !== false) { - $fs->delete_area_files($this->context->id, 'assignment_submission', $USER->id); - if ($file = $mform->save_stored_file('newfile', $this->context->id, 'assignment_submission', $USER->id, '/', $filename, false, $USER->id)) { + $fs->delete_area_files($this->context->id, 'assignment_submission', $submission->id); + + if (empty($submission->id)) { $submission = $this->get_submission($USER->id, true); //create new submission if needed - $submission->timemodified = time(); - $submission->numfiles = 1; - if ($DB->update_record('assignment_submissions', $submission)) { + } + + if ($file = $mform->save_stored_file('newfile', $this->context->id, 'assignment_submission', $submission->id, '/', $filename, false, $USER->id)) { + $updates = new object(); //just enough data for updating the submission + $updates->timemodified = time(); + $updates->numfiles = 1; + $updates->id = $submission->id; + if ($DB->update_record('assignment_submissions', $updates)) { add_to_log($this->course->id, 'assignment', 'upload', 'view.php?a='.$this->assignment->id, $this->assignment->id, $this->cm->id); $this->update_grade($submission); $this->email_teachers($submission); - echo $OUTPUT->heading(get_string('uploadedfile')); //trigger event with information about this file. $eventdata = new object(); $eventdata->component = 'mod/assignment'; @@ -120,21 +124,19 @@ class assignment_uploadsingle extends assignment_base { $eventdata->file = $file; events_trigger('assignment_file_sent', $eventdata); - redirect('view.php?id='.$this->cm->id); + redirect('view.php?id='.$this->cm->id, get_string('uploadedfile')); } else { - echo $OUTPUT->notification(get_string("uploadnotregistered", "assignment", $newfile_name) ); $file->delete(); + redirect('view.php?id='.$this->cm->id, get_string('uploadnotregistered', 'assignment', $newfile_name)); } } } } else { - echo $OUTPUT->notification(get_string("uploaderror", "assignment")); //submitting not allowed! + redirect('view.php?id='.$this->cm->id, get_string('uploaderror', 'assignment')); //submitting not allowed! } } - echo $OUTPUT->continue_button('view.php?id='.$this->cm->id); - - $this->view_footer(); + redirect('view.php?id='.$this->cm->id); } function setup_elements(&$mform) {