public function save_dates(cm_info $cm, array $dates) { global $DB, $COURSE; $update = new stdClass(); $update->id = $cm->instance; $update->duedate = $dates['duedate']; $update->allowsubmissionsfromdate = $dates['allowsubmissionsfromdate']; $update->cutoffdate = $dates['cutoffdate']; $result = $DB->update_record('assign', $update); $module = new assign(context_module::instance($cm->id), null, null); // Update the calendar and grades. $module->update_calendar($cm->id); $module->update_gradebook(false, $cm->id); }
/** * This function converts all of the base settings for an instance of * the old assignment to the new format. Then it calls each of the plugins * to see if they can help upgrade this assignment. * @param int $oldassignmentid (don't rely on the old assignment type even being installed) * @param string $log This string gets appended to during the conversion process * @return bool true or false */ public function upgrade_assignment($oldassignmentid, & $log) { // steps to upgrade an assignment global $DB, $CFG, $USER; // steps to upgrade an assignment // is the user the admin? admin check goes here if (!is_siteadmin($USER->id)) { return false; } // should we use a shutdown handler to rollback on timeout? @set_time_limit(ASSIGN_MAX_UPGRADE_TIME_SECS); // get the module details $oldmodule = $DB->get_record('modules', array('name'=>'assignment'), '*', MUST_EXIST); $oldcoursemodule = $DB->get_record('course_modules', array('module'=>$oldmodule->id, 'instance'=>$oldassignmentid), '*', MUST_EXIST); $oldcontext = context_module::instance($oldcoursemodule->id); // first insert an assign instance to get the id $oldassignment = $DB->get_record('assignment', array('id'=>$oldassignmentid), '*', MUST_EXIST); $oldversion = get_config('assignment_' . $oldassignment->assignmenttype, 'version'); $data = new stdClass(); $data->course = $oldassignment->course; $data->name = $oldassignment->name; $data->intro = $oldassignment->intro; $data->introformat = $oldassignment->introformat; $data->alwaysshowdescription = 1; $data->sendnotifications = $oldassignment->emailteachers; $data->sendlatenotifications = $oldassignment->emailteachers; $data->duedate = $oldassignment->timedue; $data->allowsubmissionsfromdate = $oldassignment->timeavailable; $data->grade = $oldassignment->grade; $data->submissiondrafts = $oldassignment->resubmit; $data->preventlatesubmissions = $oldassignment->preventlate; $newassignment = new assign(null, null, null); if (!$newassignment->add_instance($data, false)) { $log = get_string('couldnotcreatenewassignmentinstance', 'mod_assign'); return false; } // now create a new coursemodule from the old one $newmodule = $DB->get_record('modules', array('name'=>'assign'), '*', MUST_EXIST); $newcoursemodule = $this->duplicate_course_module($oldcoursemodule, $newmodule->id, $newassignment->get_instance()->id); if (!$newcoursemodule) { $log = get_string('couldnotcreatenewcoursemodule', 'mod_assign'); return false; } // convert the base database tables (assignment, submission, grade) // these are used to store information in case a rollback is required $gradingarea = null; $gradingdefinitions = null; $gradeidmap = array(); $completiondone = false; $gradesdone = false; // from this point we want to rollback on failure $rollback = false; try { $newassignment->set_context(context_module::instance($newcoursemodule->id)); // the course module has now been created - time to update the core tables // copy intro files $newassignment->copy_area_files_for_upgrade($oldcontext->id, 'mod_assignment', 'intro', 0, $newassignment->get_context()->id, 'mod_assign', 'intro', 0); // get the plugins to do their bit foreach ($newassignment->get_submission_plugins() as $plugin) { if ($plugin->can_upgrade($oldassignment->assignmenttype, $oldversion)) { $plugin->enable(); if (!$plugin->upgrade_settings($oldcontext, $oldassignment, $log)) { $rollback = true; } } } foreach ($newassignment->get_feedback_plugins() as $plugin) { if ($plugin->can_upgrade($oldassignment->assignmenttype, $oldversion)) { $plugin->enable(); if (!$plugin->upgrade_settings($oldcontext, $oldassignment, $log)) { $rollback = true; } } } // see if there is advanced grading upgrades required $gradingarea = $DB->get_record('grading_areas', array('contextid'=>$oldcontext->id, 'areaname'=>'submission'), '*', IGNORE_MISSING); if ($gradingarea) { $DB->update_record('grading_areas', array('id'=>$gradingarea->id, 'contextid'=>$newassignment->get_context()->id, 'component'=>'mod_assign', 'areaname'=>'submissions')); $gradingdefinitions = $DB->get_records('grading_definitions', array('areaid'=>$gradingarea->id)); } // upgrade completion data $DB->set_field('course_modules_completion', 'coursemoduleid', $newcoursemodule->id, array('coursemoduleid'=>$oldcoursemodule->id)); $DB->set_field('course_completion_criteria', 'module', 'assign', array('moduleinstance'=>$oldcoursemodule->id)); $DB->set_field('course_completion_criteria', 'moduleinstance', $newcoursemodule->id, array('moduleinstance'=>$oldcoursemodule->id)); $completiondone = true; // copy all the submission data (and get plugins to do their bit) $oldsubmissions = $DB->get_records('assignment_submissions', array('assignment'=>$oldassignmentid)); foreach ($oldsubmissions as $oldsubmission) { $submission = new stdClass(); $submission->assignment = $newassignment->get_instance()->id; $submission->userid = $oldsubmission->userid; $submission->timecreated = $oldsubmission->timecreated; $submission->timemodified = $oldsubmission->timemodified; $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; $submission->id = $DB->insert_record('assign_submission', $submission); if (!$submission->id) { $log .= get_string('couldnotinsertsubmission', 'mod_assign', $submission->userid); $rollback = true; } foreach ($newassignment->get_submission_plugins() as $plugin) { if ($plugin->can_upgrade($oldassignment->assignmenttype, $oldversion)) { if (!$plugin->upgrade($oldcontext, $oldassignment, $oldsubmission, $submission, $log)) { $rollback = true; } } } if ($oldsubmission->timemarked) { // submission has been graded - create a grade record $grade = new stdClass(); $grade->assignment = $newassignment->get_instance()->id; $grade->userid = $oldsubmission->userid; $grade->grader = $oldsubmission->teacher; $grade->timemodified = $oldsubmission->timemarked; $grade->timecreated = $oldsubmission->timecreated; // $grade->locked = $oldsubmission->locked; $grade->grade = $oldsubmission->grade; $grade->mailed = $oldsubmission->mailed; $grade->id = $DB->insert_record('assign_grades', $grade); if (!$grade->id) { $log .= get_string('couldnotinsertgrade', 'mod_assign', $grade->userid); $rollback = true; } // copy any grading instances if ($gradingarea) { $gradeidmap[$grade->id] = $oldsubmission->id; foreach ($gradingdefinitions as $definition) { $DB->set_field('grading_instances', 'itemid', $grade->id, array('definitionid'=>$definition->id, 'itemid'=>$oldsubmission->id)); } } foreach ($newassignment->get_feedback_plugins() as $plugin) { if ($plugin->can_upgrade($oldassignment->assignmenttype, $oldversion)) { if (!$plugin->upgrade($oldcontext, $oldassignment, $oldsubmission, $grade, $log)) { $rollback = true; } } } } } $newassignment->update_calendar($newcoursemodule->id); $newassignment->update_gradebook(false,$newcoursemodule->id); // copy the grades from the old assignment to the new one $DB->set_field('grade_items', 'itemmodule', 'assign', array('iteminstance'=>$oldassignment->id)); $DB->set_field('grade_items', 'iteminstance', $newassignment->get_instance()->id, array('iteminstance'=>$oldassignment->id)); $gradesdone = true; } catch (Exception $exception) { $rollback = true; $log .= get_string('conversionexception', 'mod_assign', $exception->error); } if ($rollback) { // roll back the grades changes if ($gradesdone) { // copy the grades from the old assignment to the new one $DB->set_field('grade_items', 'itemmodule', 'assignment', array('iteminstance'=>$newassignment->get_instance()->id)); $DB->set_field('grade_items', 'iteminstance', $oldassignment->id, array('iteminstance'=>$newassignment->get_instance()->id)); } // roll back the completion changes if ($completiondone) { $DB->set_field('course_modules_completion', 'coursemoduleid', $oldcoursemodule->id, array('coursemoduleid'=>$newcoursemodule->id)); $DB->set_field('course_completion_criteria', 'module', 'assignment', array('moduleinstance'=>$newcoursemodule->id)); $DB->set_field('course_completion_criteria', 'moduleinstance', $oldcoursemodule->id, array('moduleinstance'=>$newcoursemodule->id)); } // roll back the advanced grading update if ($gradingarea) { foreach ($gradeidmap as $newgradeid => $oldsubmissionid) { foreach ($gradingdefinitions as $definition) { $DB->set_field('grading_instances', 'itemid', $oldsubmissionid, array('definitionid'=>$definition->id, 'itemid'=>$newgradeid)); } } $DB->update_record('grading_areas', array('id'=>$gradingarea->id, 'contextid'=>$oldcontext->id, 'component'=>'mod_assignment', 'areaname'=>'submission')); } $newassignment->delete_instance(); return false; } // all is well, // delete the old assignment (use object delete) $cm = get_coursemodule_from_id('', $oldcoursemodule->id, $oldcoursemodule->course); if ($cm) { $this->delete_course_module($cm); } rebuild_course_cache($oldcoursemodule->course); return true; }