diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 61d8624f936d0..37049cf4969b7 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -91,6 +91,7 @@ $string['defaultplugins'] = 'Default assignment settings'; $string['defaultplugins_help'] = 'These settings define the defaults for all new assignments.'; $string['defaultteam'] = 'Default team'; +$string['deleteallsubmissions'] = 'Delete all submissions'; $string['deletepluginareyousure'] = 'Delete assignment plugin {$a}: are you sure?'; $string['deletepluginareyousuremessage'] = 'You are about to completely delete the assignment plugin {$a}. This will completely delete everything in the database associated with this assignment plugin. Are you SURE you want to continue?'; $string['deletingplugin'] = 'Deleting plugin {$a}.'; diff --git a/mod/assign/lib.php b/mod/assign/lib.php index 9b52848c557d6..ae530884c59bc 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -54,6 +54,72 @@ function assign_delete_instance($id) { return $assignment->delete_instance(); } +/** + * This function is used by the reset_course_userdata function in moodlelib. + * This function will remove all assignment submissions and feedbacks in the database + * and clean up any related data. + * @param $data the data submitted from the reset course. + * @return array status array + */ +function assign_reset_userdata($data) { + global $CFG, $DB; + require_once($CFG->dirroot . '/mod/assign/locallib.php'); + + $status = array(); + $params = array('courseid'=>$data->courseid); + $sql = "SELECT a.id FROM {assign} a WHERE a.course=:courseid"; + $course = $DB->get_record('course', array('id'=> $data->courseid), '*', MUST_EXIST); + if ($assigns = $DB->get_records_sql($sql,$params)) { + foreach ($assigns as $assign) { + $cm = get_coursemodule_from_instance('assign', $assign->id, $data->courseid, false, MUST_EXIST); + $context = context_module::instance($cm->id); + $assignment = new assign($context, $cm, $course); + $status = array_merge($status, $assignment->reset_userdata($data)); + } + } + return $status; +} + +/** + * Removes all grades from gradebook + * + * @param int $courseid The ID of the course to reset + * @param string $type Optional type of assignment to limit the reset to a particular assignment type + */ +function assign_reset_gradebook($courseid, $type='') { + global $CFG, $DB; + + $params = array('moduletype'=>'assign','courseid'=>$courseid); + $sql = 'SELECT a.*, cm.idnumber as cmidnumber, a.course as courseid + FROM {assign} a, {course_modules} cm, {modules} m + WHERE m.name=:moduletype AND m.id=cm.module AND cm.instance=a.id AND a.course=:courseid'; + + if ($assignments = $DB->get_records_sql($sql,$params)) { + foreach ($assignments as $assignment) { + assign_grade_item_update($assignment, 'reset'); + } + } +} + +/** + * Implementation of the function for printing the form elements that control + * whether the course reset functionality affects the assignment. + * @param $mform form passed by reference + */ +function assign_reset_course_form_definition(&$mform) { + $mform->addElement('header', 'assignheader', get_string('modulenameplural', 'assign')); + $mform->addElement('advcheckbox', 'reset_assign_submissions', get_string('deleteallsubmissions','assign')); +} + +/** + * Course reset form defaults. + * @param object $course + * @return array + */ +function assign_reset_course_form_defaults($course) { + return array('reset_assign_submissions'=>1); +} + /** * Update an assignment instance * diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index bd1f6e0e20ad5..7d9ab41556088 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -552,6 +552,82 @@ public function delete_instance() { return $result; } + /** + * Actual implementation of the reset course functionality, delete all the + * assignment submissions for course $data->courseid. + * + * @param $data the data submitted from the reset course. + * @return array status array + */ + public function reset_userdata($data) { + global $CFG,$DB; + + $componentstr = get_string('modulenameplural', 'assign'); + $status = array(); + + $fs = get_file_storage(); + if (!empty($data->reset_assign_submissions)) { + // Delete files associated with this assignment. + foreach ($this->submissionplugins as $plugin) { + $fileareas = array(); + $plugincomponent = $plugin->get_subtype() . '_' . $plugin->get_type(); + $fileareas = $plugin->get_file_areas(); + foreach ($fileareas as $filearea) { + $fs->delete_area_files($this->context->id, $plugincomponent, $filearea); + } + + if (!$plugin->delete_instance()) { + $status[] = array('component'=>$componentstr, + 'item'=>get_string('deleteallsubmissions','assign'), + 'error'=>$plugin->get_error()); + } + } + + foreach ($this->feedbackplugins as $plugin) { + $fileareas = array(); + $plugincomponent = $plugin->get_subtype() . '_' . $plugin->get_type(); + $fileareas = $plugin->get_file_areas(); + foreach ($fileareas as $filearea) { + $fs->delete_area_files($this->context->id, $plugincomponent, $filearea); + } + + if (!$plugin->delete_instance()) { + $status[] = array('component'=>$componentstr, + 'item'=>get_string('deleteallsubmissions','assign'), + 'error'=>$plugin->get_error()); + } + } + + $assignssql = "SELECT a.id + FROM {assign} a + WHERE a.course=:course"; + $params = array ("course" => $data->courseid); + + $DB->delete_records_select('assign_submission', "assignment IN ($assignssql)", $params); + $status[] = array('component'=>$componentstr, + 'item'=>get_string('deleteallsubmissions','assign'), + 'error'=>false); + + if (empty($data->reset_gradebook_grades)) { + // Remove all grades from gradebook. + require_once($CFG->dirroot.'/mod/assign/lib.php'); + assign_reset_gradebook($data->courseid); + } + } + // Updating dates - shift may be negative too. + if ($data->timeshift) { + shift_course_mod_dates('assign', + array('duedate', 'allowsubmissionsfromdate','cutoffdate'), + $data->timeshift, + $data->courseid); + $status[] = array('component'=>$componentstr, + 'item'=>get_string('datechanged'), + 'error'=>false); + } + + return $status; + } + /** * Update the settings for a single plugin *